复合符号
复合符号 允许在引用变量时替换其名称中的变量。
一个复合符号包含至少一个句点和至少两个其他字符。 它不能以数字或句点开头,如果复合符号中只有一个句点,那么它不能是最后一个字符。
名称以 词干 开头 (符号的该部分直到第一个句点 (包括第一个句点))。 后跟 tail,名称的部分 (由句点定界) 是常量符号,简单符号或 null。 复合符号的 派生名称 是符号的主干 (大写) ,后跟尾部,其中所有简单符号都已替换为其值。 尾部本身可以由字符
A-Z, a-z, 0-9和 @ # $ ¢ . ! ? 以及下划线组成。 尾部的值可以是任何字符串,包括空字符串和包含空格的字符串。 例如:taila='* ('
tailb=''
stem.taila=99
stem.tailb=stem.taila
say stem.tailb /* Displays: 99 */
/* But the following instruction would cause an error */
/* say stem.* ( */不能在词干后使用带有嵌入符号 (例如, 12.3E+5) 的常量符号; 在这种情况下,整个符号将不是有效的符号。这些是复合符号:
FRED.3
Array.I.J
AMESSY..One.2.
<.F.R.E.D>.<.A.B>在使用符号之前 (即,在引用时) ,语言处理器会替换尾部 (示例中的I, J和 One ) 中任何简单符号的值,从而生成新的派生名称。 然后,此派生名称将与简单符号一样使用。 即,它的值在缺省情况下是派生名称,或者 (如果它用作赋值的目标) 它的值是由派生名称命名的变量的值。对符号的替换允许对具有公共主干的变量集合进行任意索引 (下标)。 替换的值可以包含任何字符 (包括句点和空格)。 仅执行一次替换。
总结: 由符号引用的复合变量的派生名称
s0.s1.s2. --- .sn由以下人员提供d0.v1.v2. --- .vn其中 d0 是符号 s0的大写形式, v1 到 vn 是 s1 到 sn的常量或简单符号的值。 任何符号 s1-sn 都可以为空。 值 v1-vn 也可以为空,并且可以包含任何字符 (特别是,小写字符不会转换为大写,空格不会被除去,句点没有特殊意义)。下面是从 REXX 程序中小摘录的一些示例:
a=3 /* assigns '3' to the variable A */
z=4 /* '4' to Z */
c='Fred' /* 'Fred' to C */
a.z='Fred' /* 'Fred' to A.4 */
a.fred=5 /* '5' to A.FRED */
a.c='Bill' /* 'Bill' to A.Fred */
c.c=a.fred /* '5' to C.Fred */
y.a.z='Annie' /* 'Annie' to Y.3.4 */
say a z c a.a a.z a.c c.a a.fred y.a.4
/* displays the string: */
/* "3 4 Fred A.3 Fred Bill C.3 5 Annie" */您可以使用复合符号来设置下标不一定是数字的数组和变量列表,从而为程序员提供很大的作用域。 一个有用的应用是设置一个数组,在该数组中下标取自一个或多个变量的值,实现一种形式的关联内存 (内容可寻址)。
实现最大值: 变量名称在替换前后的长度不能超过 250 个字符。