2012-01-09 3 views
4

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

/* REXXA */ 
say 'hello' 

run_test: 
say 'test' 

...

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

Как я могу изменить REXXB сказать только 'тест'?

EDIT: Дальнейшие исследования показывают, что я могу искать RxFuncAdd - может ли кто-нибудь подтвердить, работает ли это с мэйнфреймом Rexx? Большинство ссылок, связанных с этим, касались библиотек DLL ...

EDIT 2: По-видимому, нет ... у кого-нибудь есть лучшие идеи? RxFuncAdd routine not found

EDIT 3: Я не должен объяснил мои требования должным образом, жаль, что - в соответствии с комментарием под ответ NealB, я по существу хочу что-то похожее на вызов функции «грех» внутри класса «математики». Код, который я пишу, это REXXB в приведенном выше примере, и я хочу как можно меньше изменить REXXA.

ответ

6

Непосредственно нет никакого способа для решения внутренних меток в другой программе.

Моя первая инстинктивная реакция является то, что вам придется немного изменить 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 External functions and subroutines, and function packages, z/OS V11 flavor описывает, как это сделать.

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

+0

Спасибо за это, этого я и ожидал. Существующий сценарий rexx использует аналогичную концепцию для вашего кода (он используется для интерпретации команд, введенных в панель ISPF), поэтому я посмотрю, смогу ли я использовать это. Он уже является членом EXEC PDS, поэтому ни одно из других решений действительно не подходит. –

+0

Я всегда хотел попробовать создать внешний набор функций для REXX, но у меня никогда не было этой возможности. Когда-нибудь, надеюсь ... – zarchasmpgmr

1

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

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

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

2

cschneid имеет право идея ... следующие работы в рамках как ТСО (г/ОС) и 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: Введите REXXA и напечатайте как hello, так и test. Ввод REXXB напечатает только test.

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

+0

Спасибо за это, возможно, я немного усложнил его - я хочу сделать как можно меньше изменений в REXXA, например. в VB.NET, если у меня есть класс под названием «математика» и функция, называемая «sin» внутри него, я могу вызвать «sin» из другого кода, выполнив math.sin() ... Если у меня есть существующий набор функций внутри сценария rexx (т. е. REXXA) можно вызвать только один из них из REXXB без изменения REXXA? Ключевым требованием является то, что «библиотека» (то есть REXXA или гипотетический «математический» класс) в основном остается неизменной. –