任务和符号

变量 是一个对象,其值可以在 REXX 程序运行期间更改。 更改变量值的过程称为 变量指定新值。 变量的值是可包含任何字符的任意长度的单个字符串。

可以使用 ARG , PARSE 或 PULL 指令, VALUE 内置函数或变量池接口向变量分配新值。 更改变量值的最常见方法是赋值指令本身。 以下格式的任何子句都被视为赋值:

symbol=expression; 
表达式的结果将成为等号前的符号命名的变量的新值。 当前,在 VM 上,如果省略 expression,那么该变量将设置为空字符串。 但是,建议将变量显式设置为空字符串: symbol=''。 例如:
/* Next line gives FRED the value "Frederic" */
Fred='Frederic'

命名变量的符号不能以数字 (0-9) 或句点开头。 (如果对变量名称的第一个字符没有此限制,那么您可以重新定义一个数字; 例如, 3=4; 将为称为 34的变量提供值。)

即使未对表达式指定值,也可以在表达式中使用符号,因为符号始终具有已定义的值。 未指定值的变量为 un初始化。 其值是符号本身的字符,转换为大写(即小写 a - z 转换为大写 A - Z )。然而,如果它是一个复合符号,其值是符号的派生名称。 例如:
/* If Freda has not yet been assigned a value,   */
/* then next line gives FRED the value "FREDA"   */
Fred=Freda

REXX 中符号的含义因其上下文而异。 作为表达式中的术语 (而不是关键字) ,符号属于四个组之一: 常量符号,简单符号,复合符号和词干。 不能为常量符号分配新值。 您可以对名称对应于单个值的变量使用简单符号。 可以将复合符号和词干用于更复杂的变量集合,例如数组和列表。

恒定符号

一个恒定的符号以数字( 0 - 9 )或句点开头。

常量符号的值不能更改。 它只是由符号字符组成的字符串(即,将任何小写字母转换为大写字母)。

恒定符号的示例
77
827.53
.12345
12e5 /* Same as 12E5 */
3D
17E-3

简单的符号

简单的符号不包含任何句点,且不以数字开头( 0 - 9 )。

默认情况下,其值为符号的字符(即转换为大写)。 如果符号被赋值,它就代表一个变量,其值就是该变量的值。

简单符号示例
FRED
Whatagoodidea? /* Same as WHATAGOODIDEA? */
?12
<.D.A.T.E>

复合符号

复合符号允许在引用时替换其名称中的变量。

复合符号至少包含一个句点以及至少两个其他字符。 它不能以数字或句号开头,如果复合符号中只有一个句号,则不能作为最后一个字符。

名字以词干开头(符号中从第一个句号之前的那部分)。 接下来是尾部 ,部分名称(以句点分隔)为常量符号、简单符号或空值。 复合符号的派生名称是符号的词干(大写),后接尾部,其中所有简单符号都替换为它们的值。 一个尾部本身可以由字符 A-Za-z0-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>

在使用符号(即引用时)之前,语言处理器会替换尾部任何简单符号的值(例如 IJOne ),从而生成新的派生名称。 这个派生名称就像一个简单的符号一样被使用。 也就是说,默认情况下,它的值是派生名称,或者(如果它被用作赋值的目标)它的值是派生名称所命名的变量的值。

符号替换后,可以对具有共同词干的变量集合进行任意索引(下标)。 替换的值可以包含任何字符(包括句点和空格)。 替换只进行一次。

概括地说,由符号引用的复合变量的派生名称
s0.s1.s2. --- .sn
d0.v1.v2. --- .vn
其中, d0 是符号 s0 的大写形式,而 v1vn 是常数或简单符号 s1sn 的值。 任何符号 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个字符。

注意 :以下字符在REXX在线帮助中的显示可能因您的模拟器配置中使用的代码页而异: @ # $ ¢ 。 另请参阅 CICS中的约定和术语

句号(.)是一个仅包含一个句号的符号,即最后一个字符。 它不能以数字或句点开头。

词干示例
FRED.
A.
<.A.B>.

默认情况下,字符串的值由其符号(即转换为大写)的字符组成。 如果符号被赋值,它就代表一个变量,其值就是该变量的值。

当以词干作为赋值目标时,所有以该词干开头的复合变量,无论之前是否有值,都会获得新的值。 在赋值后,引用任何带有该词干的复合符号都会返回新值,直到为词干或单个变量赋值。

例如:
hole.  = "empty"
hole.9 = "full"

say  hole.1  hole.mouse  hole.9

/* says "empty empty full" */
因此,您可以为整个变量集合赋值。 例如:
total. = 0
do forever
   say "Enter an amount and a name:"
   pull amount name
   if datatype(amount)='CHAR' then leave
   total.name = total.name + amount
   end
注意 :您始终可以通过使用词干来获取分配给整个变量集合的值。 然而,这与使用复合变量不同,复合变量的派生名称与词干相同。 例如:
total. = 0
null = ""
total.null = total.null + 5
say total. total.null              /* says "0 5" */
您可以使用DROP和PROCEDURE指令来操作变量集合,这些集合由其词干来引用。 DROP FRED. 删除所有以该词干开头的变量(见 DROP ),而 则显示所有以该词干开头的可能变量(见 PROCEDURE EXPOSE FRED. PROCEDURE )。
注:
  1. 当ARG、PARSE或PULL指令、VALUE内置函数或变量池接口更改变量时,其效果与赋值相同。 在可以赋值的任何地方,使用词干可以设置整个变量集合。
  2. 因为表达式可以包含运算符 = ,而指令可以仅由表达式组成(参见对外部环境的命令 ),所以可以通过以下规则解决可能的歧义:任何以符号开头且第二个标记是(或开头是)等号( = )的子句都是赋值 ,而不是表达式(或关键字指令)。 这不是一个限制,因为你可以确保该条款以多种方式作为命令处理,例如在名字前添加空字符串,或将表达式的前半部分括在括号内。
    同样,如果您在赋值时无意中使用了 REXX 关键字作为变量名,这也不会造成混淆。 例如,以下语句是赋值语句,而不是地址指令:
    Address='10 Downing Street';
  3. 您可以使用 SYMBOL 函数来测试符号是否已分配了值(请参阅 SYMBOL )。 此外,您可以将“NOVALUE上的信号”设置为捕获任何未初始化变量的使用(复合变量中的尾部除外;请参阅条件和条件陷阱 )。