任务和符号
变量 是一个对象,其值可以在 REXX 程序运行期间更改。 更改变量值的过程称为 为 变量指定新值。 变量的值是可包含任何字符的任意长度的单个字符串。
可以使用 ARG , PARSE 或 PULL 指令, VALUE 内置函数或变量池接口向变量分配新值。 更改变量值的最常见方法是赋值指令本身。 以下格式的任何子句都被视为赋值:
symbol=expression;
expression,那么该变量将设置为空字符串。 但是,建议将变量显式设置为空字符串: symbol=''。 例如:/* Next line gives FRED the value "Frederic" */
Fred='Frederic'命名变量的符号不能以数字 (0-9) 或句点开头。 (如果对变量名称的第一个字符没有此限制,那么您可以重新定义一个数字; 例如, 3=4; 将为称为 3 值 4的变量提供值。)
a - z 转换为大写 A - Z )。然而,如果它是一个复合符号,其值是符号的派生名称。 例如:/* If Freda has not yet been assigned a value, */
/* then next line gives FRED the value "FREDA" */
Fred=FredaREXX 中符号的含义因其上下文而异。 作为表达式中的术语 (而不是关键字) ,符号属于四个组之一: 常量符号,简单符号,复合符号和词干。 不能为常量符号分配新值。 您可以对名称对应于单个值的变量使用简单符号。 可以将复合符号和词干用于更复杂的变量集合,例如数组和列表。
恒定符号
一个恒定的符号以数字( 0 - 9 )或句点开头。
常量符号的值不能更改。 它只是由符号字符组成的字符串(即,将任何小写字母转换为大写字母)。
- 恒定符号的示例
77
简单的符号
简单的符号不包含任何句点,且不以数字开头( 0 - 9 )。
默认情况下,其值为符号的字符(即转换为大写)。 如果符号被赋值,它就代表一个变量,其值就是该变量的值。
- 简单符号示例
FRED
复合符号
复合符号允许在引用时替换其名称中的变量。
复合符号至少包含一个句点以及至少两个其他字符。 它不能以数字或句号开头,如果复合符号中只有一个句号,则不能作为最后一个字符。
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
在使用符号(即引用时)之前,语言处理器会替换尾部任何简单符号的值(例如 I 、 J 和 One ),从而生成新的派生名称。 这个派生名称就像一个简单的符号一样被使用。 也就是说,默认情况下,它的值是派生名称,或者(如果它被用作赋值的目标)它的值是派生名称所命名的变量的值。
符号替换后,可以对具有共同词干的变量集合进行任意索引(下标)。 替换的值可以包含任何字符(包括句点和空格)。 替换只进行一次。
s0.s1.s2. --- .sn由d0.v1.v2. --- .vn其中, d0 是符号 s0 的大写形式,而 v1 至 vn 是常数或简单符号 s1 至 sn 的值。 任何符号 s1 - sn 都可以为空。 v1- vn 也可以为空,并且可以包含任何字符(特别是,小写字符不会转换为大写,空格不会被删除,句号没有特殊含义)。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个字符。
茎
句号(.)是一个仅包含一个句号的符号,即最后一个字符。 它不能以数字或句点开头。
- 词干示例
FRED.
默认情况下,字符串的值由其符号(即转换为大写)的字符组成。 如果符号被赋值,它就代表一个变量,其值就是该变量的值。
当以词干作为赋值目标时,所有以该词干开头的复合变量,无论之前是否有值,都会获得新的值。 在赋值后,引用任何带有该词干的复合符号都会返回新值,直到为词干或单个变量赋值。
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
endtotal. = 0
null = ""
total.null = total.null + 5
say total. total.null /* says "0 5" */DROP FRED. 删除所有以该词干开头的变量(见 DROP ),而 则显示所有以该词干开头的可能变量(见 PROCEDURE EXPOSE FRED. PROCEDURE )。- 当ARG、PARSE或PULL指令、VALUE内置函数或变量池接口更改变量时,其效果与赋值相同。 在可以赋值的任何地方,使用词干可以设置整个变量集合。
- 因为表达式可以包含运算符
=,而指令可以仅由表达式组成(参见对外部环境的命令 ),所以可以通过以下规则解决可能的歧义:任何以符号开头且第二个标记是(或开头是)等号(=)的子句都是赋值 ,而不是表达式(或关键字指令)。 这不是一个限制,因为你可以确保该条款以多种方式作为命令处理,例如在名字前添加空字符串,或将表达式的前半部分括在括号内。同样,如果您在赋值时无意中使用了 REXX 关键字作为变量名,这也不会造成混淆。 例如,以下语句是赋值语句,而不是地址指令:Address='10 Downing Street'; - 您可以使用 SYMBOL 函数来测试符号是否已分配了值(请参阅 SYMBOL )。 此外,您可以将“NOVALUE上的信号”设置为捕获任何未初始化变量的使用(复合变量中的尾部除外;请参阅条件和条件陷阱 )。