2012-01-09 36 views
4

私はRexxスクリプトをスタンドアローンで使用していますが、別のRexxスクリプトを使用してその中の特定の関数を呼び出したいとします。私はcallで外部Rexxファイルと内部Rexx関数の両方を呼び出すことができますが、外部スクリプト内で単一の関数を呼び出すことはできますか?次の例では、私が何をしたいのかを示しています。外部のRexxスクリプトで特定の関数を呼び出す

/* REXXA */ 
say 'hello' 

run_test: 
say 'test' 

...

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

どのように私は 'test' と言ってREXXBを変更することができますか?

EDIT:今後の研究では、RxFuncAddを探している可能性があることを示しています。メインフレームRexxスクリプトで動作するかどうかは誰でも確認できますか?それを含む参照のほとんどは、DLLライブラリに関するものです...

EDIT 2:明らかに誰かがより良いアイデアを持っていますか? RxFuncAdd routine not found

EDIT 3:私はそのことについて申し訳ありませんが、きちんと私の要件を説明していてはいけません - NealBの応答下のコメントのとおり、私は基本的に「数学」クラス内の「罪」関数を呼び出すことに似て何かをしたいです。上記の例では、私が書いているコードはREXXBです。できるだけREXXAを変更したいと思います。

答えて

6

は直接別のプログラムで内部ラベルに対処する方法はありません。

私の最初の腸の反応は、あなたが

/* 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をすることができ、外部関数とサブルーチンをサポートし、少し機能コードでラッパー関数を追加するREXXAを変更しなければならないということです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 execによって呼び出されているかどうかを判断できます。私はこれをしていないが、文書は、それが動作することを示すためにと思われる。

あなたの後の編集について:ああ、RexxにDLLのモラル相当を書きたいと思う。 RexxをSystem z上で使用するだけの方法はないと思います。

念頭に置く唯一の技術は、実行する実際の関数の名前と引数を渡すプライマリエントリポイントを持つことです。メインエントリポイントは、指定された関数を呼び出してリターンします。クルージー、申し訳ありません。

2

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と入力すると、hellotestの両方が出力されます。 REXXB と入力すると、testのみが出力されます。私は少し奇妙なこの要件を見つけることを認めなければならない

...

+0

ありがとうございました。私はそれを少し複雑にしているかもしれません。可能な限りREXXAを少し変更したいと思います。 VB.NETで 'math'というクラスがあり、その中に 'sin'という関数がある場合、math.sin()を実行することによって異なるコードから 'sin'を呼び出すことができます。既存の関数REXXAを変更することなくREXXBからREXXAのうちの1つだけを呼び出すことはできますか?重要な要件は、 '図書館'(すなわち、REXXAまたは仮想の「数学」クラス)がほとんど変わらないことである。 –

関連する問題