Вызов определенных функций во внешнем скрипте Rexx - PullRequest
4 голосов
/ 09 января 2012

У меня есть скрипт Rexx, который работает автономно, и я хочу использовать другой скрипт Rexx для вызова определенных функций внутри него. Я знаю, что могу вызывать как весь внешний файл Rexx, так и внутренние функции Rexx с помощью call, но могу ли я вызвать одну функцию внутри внешнего скрипта? Следующий пример иллюстрирует, что я хочу сделать:

/* REXXA */
say 'hello'

run_test:
say 'test'

...

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

Как я могу изменить REXXB, чтобы он говорил только «тест»?

РЕДАКТИРОВАТЬ: Дальнейшие исследования показывают, что я, возможно, ищу RxFuncAdd - кто-нибудь может подтвердить, работает ли он со сценариями Rexx мэйнфреймов? Большинство ссылок, связанных с этим, касалось библиотек DLL ...

РЕДАКТИРОВАТЬ 2: Очевидно, нет ... кто-нибудь есть идеи получше? RxFuncAdd routine not found

РЕДАКТИРОВАТЬ 3: Я, должно быть, не объяснил свои требования должным образом, извините за это - согласно комментарию под ответом NealB, я по сути хочу что-то похожее на вызов функции 'sin' внутри класса 'math'. Код, который я пишу, - это REXXB в приведенном выше примере, и я хочу изменить REXXA как можно меньше.

Ответы [ 3 ]

6 голосов
/ 10 января 2012

Непосредственно нет способа адресовать внутренние метки в другой программе.

Моя первая внутренняя реакция заключается в том, что вам придется немного изменить 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' 

Однако REXX под TSO поддерживает внешние функции и подпрограммы, которые могут быть написаны на многих языках, включая REXX.Справочник TSO / E REXX Внешние функции и подпрограммы и пакеты функций, z / OS V11 разновидность описывает, как это сделать.

В документе есть примечание о возможной компиляции REXX.Если у вас его нет, возможно, вы сможете найти кого-то, кто имеет лицензию на это, который мог бы скомпилировать его для использования с ALTLIB (лицензия не требуется).

2 голосов
/ 09 января 2012

cschneid имеет правильную идею ... Следующие работы под TSO (z / os) и Windows ooRexx:

REXXA:

/* 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 Comand Line: при наборе REXXA будут напечатаны hello и test.Ввод REXXB приведет к печати только test.

Я должен признать, что нахожу это требование немного странным ...

1 голос
/ 09 января 2012

Возможно, вы сможете использовать PARSE SOURCE , чтобы определить, называется ли вас автономным или другим Rexx exec. Я не сделал этого, но документация кажется , чтобы указать, что это будет работать.

Относительно вашего последующего редактирования: Ах, вы хотите написать моральный эквивалент DLL в Rexx, несколько точек входа, ни одна из которых не является первичной. Я не верю, что есть способ сделать это, просто используя Rexx в System z.

Единственная техника, которая приходит на ум - это иметь первичную точку входа, в которую вы передаете имя фактической функции, которую вы хотите выполнить, вместе с ее аргументами. Основная точка входа затем вызовет указанную функцию и вернется. Клудги, прости.

...