Last Name Evaluation
|
Maple supports the concept of "last name evaluation." This refers to the specific evaluation rules applied to certain kinds of expressions.
|
|
Most Maple expressions are evaluated using full recursive evaluation. This implies that each name in the expression is fully evaluated to the last assigned expression in any chain of assignments. For example, names that are assigned integers are subject to normal, full evaluation:
|
|
However, a name assigned a value of one of the special types procedure, module, or table is not fully evaluated during normal evaluation. Assignment chains are only evaluated to the last name assigned in the chain (hence the name of this property).
|
>
|
u := table( [ 1 = "a", 2 = "b" ] );
|
| (8) |
|
To obtain the final expression to which the last name in an assignment chain is assigned, you can use the function eval.
|
>
|
u := table( [ "a" = 1, "b" = 2, "c" = 3 ] );
|
| (11) |
| (13) |
|
This is frequently required when returning such expressions from procedures. A procedure that returns a table or another procedure normally requires an evaluation at the return site, using the two-argument form of eval in which the second argument is 1.
|
>
|
f := proc( n )
local p;
p := proc( s ) modp( 1 + s, n ) end;
p
end proc:
|
|
returns the escaped local variable name p, rather than the procedure that it is assigned. (Of course, the local variable p is still assigned the procedure.) By using a call to eval on the return expression,
|
>
|
f := proc( n )
local p;
p := proc( s ) modp( 1 + s, n ) end;
eval( p, 1 )
end proc:
|
| (15) |
|
the actual procedure is returned.
|
|
Although Objects are a special form of module, they are not subject to last name evaluation. For example, a MutableSet is an object: a variable that is assigned a MutableSet object will evaluate to the object, not to the variable name:
|
>
|
ms := MutableSet(1, 2, 3);
|
| (16) |
| (17) |
|
The type last_name_eval can be used to test if a name is assigned a value subject to last name evaluation:
|
>
|
type(u, 'last_name_eval');
|
>
|
type(ms, 'last_name_eval');
|
|
Last name evaluation rules for parameter or local names within procedures or modules, or exported names within modules, differ from the rules for global names:
|
•
|
Procedure parameter names are never subject to last name evaluation. Unlike local or global variables, parameters do not exist as variables, but only as values. Thus, a reference to a parameter always yields its value.
|
•
|
A local or exported variable whose value is a module always evaluates to that module when evaluated within the procedure or module (or nested procedure or module therein) in which the variable was declared. Last name evaluation applies only when the variable's value is of type procedure, table, array, matrix, or vector, or when the name is evaluated outside the scope in which was declared.
|
•
|
Fields of a packed Record, although conceptually exported module member names, are never subject to last name evaluation. Like procedure parameters, no actual names are allocated for packed Record fields, thus there is no "last name" to evaluate to.
|
|