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
'sm
method)(o, Bindings)
m3-support@elego.de