A procedure call has the form:
P(Bindings)
where P is a procedure-valued expression and Bindings is a list
of keyword or positional bindings. A keyword binding has the
form name := actual, where actual is an expression and
name is an identifier. A positional binding has the form
actual, where actual is an expression. When keyword and
positional bindings are mixed in a call, the positional bindings must precede
the keyword bindings. If the list of bindings is empty, the parentheses are
still required.
The list of bindings is rewritten to fit the signature of P's type as
follows: First, each positional binding actual is converted and added
to the list of keyword bindings by supplying the name of the
'th formal
parameter, where actual is the i'th binding in Bindings.
Second, for each parameter that has a default and is not bound after the first
step, the binding name := default is added to the list of bindings,
where name is the name of the parameter and default is its
default value. The rewritten list of bindings must bind only formal
parameters and must bind each formal parameter exactly once. For example,
suppose that the type of P is
PROCEDURE(ch: CHAR; n: INTEGER := 0)
Then the following calls are all equivalent:
P('a', 0)
P('a')
P(ch := 'a')
P(n := 0, ch := 'a')
P('a', n := 0)
The call P() is illegal, since it doesn't bind ch. The call
P(n := 0, 'a') is illegal, since it has a keyword parameter before a
positional parameter.
For a READONLY or VALUE parameter, the actual can be any
expression assignable to the type of the formal (except that the prohibition
against assigning local procedures is relaxed). For a VAR parameter,
the actual must be a writable designator whose type is the same as that of the
formal, or, in case of a VAR array parameter, assignable to that of the
formal (see the section on designators).
A VAR formal is bound to the variable designated by the corresponding
actual; that is, it is aliased. A VALUE formal is bound to a variable
with an unused location and initialized to the value of the corresponding
actual. A READONLY formal is treated as a VAR formal if the
actual is a designator and the type of the actual is the same as the type of
the formal (or an array type that is assignable to the type of the formal);
otherwise it is treated as a VALUE formal.
Implementations are allowed to forbid VAR or READONLY parameters
of packed types.
To execute the call, the procedure P and its arguments are evaluated,
the formal parameters are bound, and the body of the procedure is executed.
The order of evaluation of P and its actual arguments is undefined. It
is a checked runtime error to call an undefined or NIL procedure.
It is a checked runtime error for a procedure to raise an exception not included in its raises set (If an implementation maps this runtime error into an exception, the exception is implicitly included in all RAISES clauses.) or for a function procedure to fail to return a result.
A procedure call is a statement only if the procedure is proper. To call a
function procedure and discard its result, use EVAL.
A procedure call can also have the form:
o.m(Bindings)
where o is an object and m names one of o's methods.
This is equivalent to:
(o'smmethod)(o, Bindings)
m3-support@elego.de