【问题标题】:Calling particular functions in an external Rexx script在外部 Rexx 脚本中调用特定函数
【发布时间】: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。

【问题讨论】:

    标签: mainframe rexx


    【解决方案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 将同时打印 hello 和 test。输入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,对不起。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-17
      • 2016-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-19
      相关资源
      最近更新 更多