CALL

CALL 调用例程 (如果指定 name) 或控制特定条件的捕获 (如果指定 ON 或 OFF)。

读取语法图跳过可视语法图 CALL 名称,表达式 (expression)OFFERRORFAILUREHALTONERRORFAILUREHALTNAME陷阱名称 ;

要控制捕获,请指定 OFF 或 ON 以及要捕获的条件。 OFF 关闭指定的条件陷阱。 打开指定的条件陷阱。 有关条件陷阱的信息,请参阅 条件和条件陷阱

要调用例程,请指定 name,这是作为常量的文字串或符号。 name 必须是按字面值处理的符号或字面值字符串。 调用的例程可以是:
内部例程
与调用它的 CALL 指令或函数调用位于同一程序中的函数或子例程。
内置例程
定义为 REXX 语言的一部分的函数 (可作为子例程调用)。
外部例程
不是内置的或与调用它的 CALL 指令或函数调用不在同一程序中的函数或子例程。
如果 name 是字符串 (即,在引号中指定 name ) ,那么将绕过内部例程的搜索,并且仅调用内置函数或外部例程。 内置函数的名称 (通常也是外部例程的名称) 为大写; 因此文字串中的名称也必须为大写。
调用的例程可以选择返回一个结果,当它返回时, CALL 指令在功能上与以下子句完全相同:
读取语法图跳过可视语法图 结果 = 名称 ( ,表达式 (expression) ) ;
如果调用的例程未返回结果,那么当您将其作为函数 (如先前所示) 进行调用时,将发生错误。

REXX/CICS ® 支持指定最多 20 个表达式,以逗号分隔。 表达式按从左到右的顺序进行求值,并在执行例程期间构成自变量字符串。 被调用例程中的任何 ARG 或 PARSE ARG 指令或 ARG 内置函数都将访问这些字符串,而不是先前在调用程序中处于活动状态的任何字符串,直到控件返回到 CALL 指令为止。 如果适用,可以通过包含额外的逗号来省略表达式。

然后, CALL 会使名为 name的例程分支,使用与函数调用完全相同的机制,请参阅 函数。 搜索顺序在关于函数的部分中,但简要如下:
内部例程:
这些是同一程序中的指令序列,从与 CALL 指令中的 name 匹配的标签开始。 如果在引号中指定例程名称,那么不会为该搜索顺序考虑内部例程。 您可以一起使用 SIGNAL 和 CALL 来调用其名称是在执行时确定的内部例程; 这称为多路调用 (请参阅 SIGNAL)。 RETURN 指令完成内部例程的执行。
内置例程:
这些是内置到语言处理器中的例程,用于提供各种功能。 它们始终返回作为例程结果的字符串。 (请参阅 内置函数。)
外部例程:
用户可以编写或使用语言处理器和调用程序外部的例程。 外部例程必须以 REXX 编码。 如果 CALL 指令调用以 REXX 编写的外部例程作为子例程,那么您可以使用 ARG 或 PARSE ARG 指令或 ARG 内置函数来检索任何自变量字符串。
在执行内部例程期间,通常可访问先前已知的所有变量。 但是, PROCEDURE 指令可以设置一个局部变量环境来保护子例程和调用者相互保护。 PROCEDURE 指令上的公开选项可以向例程公开选定的变量。

调用外部程序作为子例程类似于调用内部例程。 但是,外部例程是一个隐式 PROCEDURE ,因为所有调用者的变量始终处于隐藏状态。 内部值 (NUMERIC 设置等) 的状态以它们的缺省值 (而不是继承调用者的缺省值) 开头。 此外,您可以使用 EXIT 从例程返回。

当控件到达内部例程时, CALL 指令的行号在变量 SIGL (在调用者的变量环境中) 中可用。 这可以用作调试辅助,因为这样可以发现控制是如何到达例程的。 如果内部例程使用 PROCEDURE 指令,那么它需要公开 SIGL 以获取对 CALL 的行号的访问权。

最终,子例程应该处理 RETURN 指令,此时控制将返回到原始 CALL 后面的子句。 如果 RETURN 指令指定了表达式,那么变量 RESULT 将设置为该表达式的值。 否则,将删除变量 RESULT (变为未初始化)。

内部例程可以包括对其他内部例程的调用以及对自身的递归调用。

实现最大值: 控制结构 (包括内部例程调用) 的总嵌套取决于可用的存储器。

示例

/* Recursive subroutine execution... */
arg z
call factorial z
say z'! =' result
exit

factorial: procedure     /* Calculate factorial by  */
  arg n                  /*  recursive invocation.  */
  if n=0 then return 1
  call factorial n-1
  return  result * n
在内部子例程 (和函数) 执行期间,将自动保存所有重要信息片段,然后在从例程返回时恢复这些信息。 它们是:
  • DO 循环和其他结构的状态。

    在子例程中执行 SIGNAL 是安全的,因为未结束 DO 循环等在调用子例程时处于活动状态的循环。 (但子例程中当前处于活动状态的那些已结束。)

  • 跟踪操作。

    调试子例程后,可以在其开头插入 TRACE Off ,这不会影响调用者的跟踪。 相反,如果您只想调试子例程,那么可以在启动时插入 TRACE 结果,并且在返回时跟踪会自动恢复到条目处的条件 (例如, Off)。 类似地, ? (交互式调试) 和 ! (命令抑制) 跨例程保存。

  • NUMERIC 设置。

    将保存算术运算的位, FUZZ 和 FORM (请参阅 数字) ,然后在返回时恢复。 因此,子例程可以设置它需要使用的精度等,而不影响调用者。

  • ADDRESS 设置。

    将保存命令的当前目标和先前目标 (请参阅 ADDRESS) ,然后在返回时恢复这些目标。

  • 条件陷阱。

    保存条件陷阱 (CALL ON 和 SIGNAL ON) ,然后在返回时恢复。 这意味着可以在子例程中使用 CALL ON , CALL OFF , SIGNAL ON 和 SIGNAL OFF ,而不影响调用者设置的条件。

  • 条件信息。

    此信息描述当前受困情况的状态和源。 CONDITION 内置函数返回此信息。 请参阅 条件 (CONDITION)

  • 耗用时间时钟。

    子例程从其调用者继承弹性时间时钟 (请参阅 TIME) ,但由于时间时钟保存在例程调用之间,子例程或内部函数可以独立重新启动和使用时钟而不影响其调用者。 出于同样的原因,在内部例程中启动的时钟对于调用者不可用。

  • 选项设置。

    将保存 ETMODE 和 EXMODE ,然后在返回时恢复。 有关更多信息,请参阅 选项