2.3.1 Assignments
Assignments are clauses where the first token is a symbol and the
second token is the equal sign (=). This definition opens for some
curious effects, consider the following clauses:
a == b
This is not a command, but an assignment of the expression =
b to the variable a. Of course, the expression is illegal
(=b) and will trigger a SYNTAX condition for syntax error
{35}. TRL2 defines the operator == as consisting of two
tokens. Thus, in the first of these examples, the second
token is =, the third token is also =, while the fourth token
is b.
3 = 5
This is an assignment of the value 5 to the symbol 3, but
since this is not a variable symbol, this is an illegal
assignment, and will trigger the SYNTAX condition for syntax
error {31}.
“hello” = foo
This is not an invalid assignment, since the first token in
the clause is not a symbol. Instead, this becomes a command.
arg =(foo) bar
The fourth statement is a valid assignment, which will space-
concatenate the two variable symbols foo and bar, and assign
the result to the variable symbol arg. It is specifically not
an ARG instruction, even though it might look like one. If
you need an ARG instruction which template starts with an
absolute indirect positional pattern, use the PARSE UPPER ARG
instruction instead, or prepend a dot in front of the
template.
An assignment can assign a value to a simple variable, a stem
variable or a compound variable. When assigning to a stem
variable, all possible variable symbols having that stem are
assigned the value. Note specifically that this is not like
setting a default, it is a one time multiple assignment.
Example: Multiple assignment
The difference between REXX’s multiple assignment and a default
value can be seen from the following code:
foo. = ‘bar’
foo.1 = ‘baz’
drop foo.1
say foo.1 /* says “FOO.1” */
Here, the SAY instruction writes out FOO.1, not bar. During the
DROP instruction, the variable FOO.1 regains its original,
uninitialized value FOO.1, not the value of its stem variable
FOO., i.e. bar, because stem assignments does not set up a
default.
Example: Emulating a default value
If you want to set the compound variable to the value of its stem
variable, if the stem is initialized, then you may use the
following code:
if (symbol(‘foo.’)) then
foo.1 = foo.
else
drop foo.1
In this example, the FOO.1 variable is set to the value of its
stem if the stem currently is assigned a value. Else, the FOO.1
variable is dropped.
However, this is probably not exactly the same, since the internal
storage of the computer is likely to store variables like FOO.2
and FOO.3 only implicitly (after all, it can not explicitly store
every compound having FOO. as stem). After the assignment of the
value of FOO. to FOO.1, the FOO.1 compound variable is likely to
be explicitly stored in the interpreter.
There is no way you can discover the difference, but the effects
are often that more memory is used, and some functionality that
dumps all variables may dump FOO.1 but not FOO.2 (which is
inconsistent). See section RexxVariablePool.
Example: Space considerations
Even more strange are the effects of the following short example:
foo. = ‘bar’
drop foo.1
Although apparently very simple, there is no way that an
interpreter can release all memory referring to FOO.1. After all,
FOO.1 has a different value than FOO.2, FOO.3, etc., so the
interpreter must store information that tells it that FOO.1 has
the uninitialized value.
These considerations may seem like nit-picking, but they will
matter if you drop lots of compound variables for a stem which has
previously received a value. Some programming idioms do this, so
be aware. If you can do without assigning to the stem variable,
then it is possible for the interpreter to regain all memory used
for that stem’s compound variables.
PREV NEXT