[Bug 1583] [FS] technical: 4.1.5 Function Calls: refactor

http://www.w3.org/Bugs/Public/show_bug.cgi?id=1583


simeon@us.ibm.com changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |ASSIGNED




------- Additional Comments From simeon@us.ibm.com  2005-07-27 13:05 -------
Agreed, we may find a better way to write those rules.
Here are some proposed rules to address the comment, trying to improve on the
readability for the existing rules.
- Jerome

Notations
---------

We should introduce a new formal grammar production:

  [Formal] FunctionSig ::= "declare" "function" QName "(" ParamList? (")" | (")"
"as" SequenceType))

Such production is notably used in the static context (for statEnv.funcType).


Dynamic semantics
-----------------

Here is the generic rule function function calls:

  dynEnv |- Expr1 => Value1
  ...
  dynEnv |- Exprn => Valuen
  statEnv |- QName of func expands to expanded-QName
  statEnv.funcType(expanded-QName) = { FunctionSig1, ..., FunctionSigm }
  FunctionSigi = declare function expanded-QName(Type1, ..., Typen) as Type
  statEnv |- Value1 against Type1 promotes to Value1'
  ...
  statEnv |- Valuen against Typen promotes to Valuen'
  dynEnv |- function expanded-QName with types (Type1,...,Typen) on values
(Value1',...,Valuen') yields Value
  statEnv |- Value against Type promotes to Value'
 
-------------------------------------------------------------------------------------------
  dynEnv |- QName ( Expr1, ..., Exprn ) => Value'


This uses the following auxiliary judgment:

  dynEnv |- function expanded-QName with types (Type1,...,Typen) on values
(Value1',...,Valuen') yields Value

which is defined as follows:

  * For user-defined functions:

  dynEnv.funcDefn(expanded-QName(Type1, ..., Typen)) = (Expr, Variable1, ... ,
Variablen)
  dynEnvDefault + varValue( Variable1 => Value1; ...; Variablen => Valuen) |-
Expr => Value
 
---------------------------------------------------------------------------------------------------------
  dynEnv |- function expanded-QName with types (Type1,...,Typen) on values
(Value1,...,Valuen) yields Value

  * For built-in or functions:

  dynEnv.funcDefn(expanded-QName(Type1, ..., Typen)) = #BUILT-IN
  "The built-in function" expanded-QName "(See [Functions and
  Operators] or [7 Additional Semantics of Functions]) applied to"
  (Value1,...Value2) "yields the value" Value
 
---------------------------------------------------------------------------------------------------------
  dynEnv |- function expanded-QName with types (Type1,...,Typen) on values
(Value1,...,Valuen) yields Value

  * For external functions:

  dynEnv.funcDefn(expanded-QName(Type1, ..., Typen)) = #EXTERNAL
  "The external function" expanded-QName "applied to"
  (Value1,...Value2) "yields the value" Value
 
---------------------------------------------------------------------------------------------------------
  dynEnv |- function expanded-QName with types (Type1,...,Typen) on values
(Value1,...,Valuen) yields Value

  * For imported functions:

  Note that this case also checks that the parameteres can be promoted
  in the context of the imported module.

  dynEnv.funcDefn(expanded-QName(Type1, ..., Typen)) = #IMPORTED(URI)
  URI =>module_statEnv statEnv1
  URI =>module_dynEnv dynEnv1
  statEnv1.funcType(expanded-QName) = { FunctionSig1', ..., FunctionSigm' }
  FunctionSigi' = declare function expanded-QName(Type1', ..., Typen') as Type'
  dynEnv1.funcDefn(expanded-QName(Type1', ..., Typen')) = (Expr, Variable1, ...
, Variablen)
  statEnv1 |- Value1 against Type1 promotes to Value1'
  ...
  statEnv1 |- Valuen against Typen promotes to Valuen'
  dynEnvDefault + varValue( Variable1 => Value1; ...; Variablen => Valuen) |-
Expr => Value
 
---------------------------------------------------------------------------------------------------------
  dynEnv |- function expanded-QName with types (Type1,...,Typen) on values
(Value1,...,Valuen) yields Value

Received on Wednesday, 27 July 2005 13:05:18 UTC