在外部 Rexx 脚本中调用特定函数

Posted

技术标签:

【中文标题】在外部 Rexx 脚本中调用特定函数【英文标题】:Calling particular functions in an external Rexx script 【发布时间】:2012-01-09 05:11:38 【问题描述】:

我有一个独立运行的 Rexx 脚本,我希望使用另一个 Rexx 脚本来调用其中的特定函数。我知道我可以使用call 调用整个外部 Rexx 文件和内部 Rexx 函数,但是我可以在外部脚本中调用单个函数吗?以下示例说明了我想要做什么:

/* REXXA */
say 'hello'

run_test:
say 'test'

...

/* REXXB */
call 'REXXA' /* will say both 'hello' and 'test' */

如何将 REXXB 修改为只说“测试”?

编辑:进一步的研究表明我可能正在寻找 RxFuncAdd - 任何人都可以确认它是否适用于大型机 Rexx 脚本?大多数涉及它的参考资料都与 DLL 库有关...

编辑 2:显然没有……有人有更好的想法吗?

编辑 3:我一定没有正确解释我的要求,对此感到抱歉 - 根据 NealB 回复下的评论,我本质上想要类似于在“数学”类中调用“罪”函数的东西。我写的代码是上例中的REXXB,我想尽量少改动REXXA。

【问题讨论】:

【参考方案1】:

直接没有办法在另一个程序中处理内部标签。

我的第一个直觉反应是,您必须稍微修改 REXXA 以添加带有函数代码的包装函数,类似于

/* REXX A */

arg a1 a2 a3 a4 a5 (etc.)
select
when a1 = 'SIN'
  call sin a2 a3 ....
when a1 = 'COS'
  call cos a2 a3 ....
end
exit rc

sin:
  return some equation involving a2 that I last saw about 33 years ago

cos:
  return some equation involving a2 that I last saw about 33 years ago

/* REXX B */
call 'REXXA' 'sin 85' 

但是,TSO 下的 REXX 确实支持可以用多种语言编写的外部函数和子例程,包括 REXX。 TSO/E REXX 参考External functions and subroutines, and function packages, z/OS V11 flavor 描述了如何执行此操作。

文档中有一条关于可选编译 REXX 的说明。如果您没有它,您也许可以找到获得许可的人,他们可以编译它以与 ALTLIB 一起使用(无需许可)。

【讨论】:

谢谢你,这正是我所期待的。现有的 rexx 脚本使用与您的代码类似的概念(它用于解释输入到 ISPF 面板的命令),所以我会看看是否可以利用它。它已经是 EXEC PDS 的成员,因此其他解决方案都不适合。 我一直想尝试为 REXX 构建一个外部函数集,但一直没有机会。希望有一天……【参考方案2】:

cschneid 有正确的想法... 以下适用于 TSO (z/os) 和 Windows ooRexx:

雷克萨:

/* REXXA */
parse source . as_a .
if as_a = 'COMMAND' then
   say 'hello'

run_test:
say 'test'
return

REXXB:

/* REXXB */
call 'REXXA' /* will say 'test' */
return

从 TSO 或 Windows 命令行提示符:键入 REXXA 将同时打印 hellotest。输入REXXB 将只打印test

我必须承认我觉得这个要求有点奇怪......

【讨论】:

谢谢你,我可能有点过于复杂了 - 我想对 REXXA 做尽可能少的更改,例如在VB.NET中,如果我有一个名为'math'的类和一个名为'sin'的函数,我可以通过执行math.sin()从不同的代码中调用'sin'......如果我有一堆现有的函数在 rexx 脚本(即 REXXA)中,我可以只从 REXXB 调用其中一个,而不修改 REXXA?关键要求是“库”(即 REXXA 或假设的“数学”类)基本保持不变。【参考方案3】:

您也许可以使用PARSE SOURCE 来确定您是被独立调用还是被其他 Rexx 执行人员调用。我还没有这样做,但文档似乎表明它会起作用。

关于您以后的编辑:啊,您想在 Rexx 中编写 DLL 的道德等价物,多个入口点,其中没有一个是主要的。我不相信仅在 System z 上使用 Rexx 就可以做到这一点。

想到的唯一技术是有一个主入口点,您可以将要执行的实际函数的名称及其参数传递到该入口点。然后主入口点将调用指定的函数并返回。 Kludgy,对不起。

【讨论】:

以上是关于在外部 Rexx 脚本中调用特定函数的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 typescript 在外部 js 文件中调用函数

JavaScript --- [基本语法之函数]

Magento:如何让观察者在外部脚本中工作?

svm 超参数调整:使用 e1071 tune.control 进行随机搜索。 random != NULL 在外部函数调用中给出 NA/NaN/Inf (arg 10)

将参数从 ISPF DSLIST 自动传递到 REXX 脚本

函数3—装饰器