CALL
CALL は、ルーチンを呼び出す (name を指定した場合) か、または特定の条件をトラップするか しないかを制御 (ON または OFF を指定した場合) します。
トラッピングを制御するには、OFF または ON のほかに、トラップしたい条件を指定します。 OFF は、指定された条件トラップをオフにします。 ON は、指定された条件トラップをオンにします。 条件トラップについては、 条件および条件トラップを参照してください。
- 内部ルーチン
- CALL 命令と同じプログラム、または CALL 命令を呼び出す関数呼び出しと同じプログラムの内部に存在する関数またはサブルーチン。
- 組み込みルーチン
- REXX 言語の一部として定義されている関数 (サブルーチンとして 呼び出すことができます)。
- 外部ルーチン
- 組み込まれたものでもなく、CALL 命令と同じプログラムまたは CALL 命令を呼び出す関数呼び出しと同じプログラムの内部にも存在しない関数またはサブルーチン。
REXX/CICS ® では、最大 20 個の式をコンマで区切って指定できます。 式は、ルーチンの実行時に左から右へ向かって評価され、引数ストリングが形成されます。 CALL 命令に制御が戻されるまでの間、呼び出されたルーチン内の ARG 命令、PARSE ARG 命令、 あるいは ARG 組み込み関数がアクセスするのは、これらのストリングであり、 呼び出しプログラム内でその前にアクティブであったストリングではありません。 必要に応じて余分にコンマを指定すれば、式を省略することができます。
- 内部ルーチン:
- 同じプログラム内の一連の命令であり、CALL 命令で 指定する name と同一のラベルで始まります。 ルーチン名を引用符で囲んで指定すると、その探索順序に内部ルーチンは含まれません。 SIGNAL と CALL を一緒に使用して、実行時に名前が決定された内部ルーチンを呼び出すことができます。これは、マルチウェイ呼び出しと呼ばれます ( SIGNALを参照)。 RETURN 命令が、内部ルーチンの実行を完了させます。
- 組み込みルーチン:
- さまざまな関数を提供するために言語処理プログラムに組み込まれている ルーチンのことです。 これらは必ず、ルーチンの結果であるストリングを戻します。 ( 組み込み関数を参照してください。)
- 外部ルーチン:
- ユーザーは、言語処理プログラムおよび呼び出しプログラムにとって外部のルーチンを、 作成または使用することができます。 外部ルーチンは、REXX でコーディングする必要があります。 REXX で作成された外部ルーチンを CALL 命令によってサブルーチンとして呼び出す場合には、 ARG 命令、PARSE ARG 命令、あるいは ARG 組み込み関数を使用して、 引数ストリングを検索することができます。
サブルーチンとしての外部プログラムの呼び出しは、内部ルーチンの呼び出しと似ています。 ただし、呼び出し元のすべての変数が常に 隠されているという点において、外部ルーチンは暗黙の PROCEDURE であるといえます。 内部値 (NUMERIC 設定値など) の状況は、 (呼び出し元から引き継いだ値ではなく) それらのデフォルトで始まります。 さらに、EXIT を使用してルーチンから戻ることができます。
制御が内部ルーチンに到達すると、CALL 命令の行番号が SIGL 変数 (呼び出し元の変数環境内にあります) で使用可能になります。 これは、そのままで、デバッグ補助機能として使用できるため、制御がルーチンにどのように到達したかが分かります。 内部ルーチンで PROCEDURE 命令を使用する場合は、CALL の行番号にアクセスするために EXPOSE SIGL が必要になります。
最終的には、サブルーチンは RETURN 命令を処理する必要があり、 制御は、その地点から、元の CALL の後の文節に戻ります。 RETURN 命令で式を指定した場合、変数 RESULT には、その式の値が設定されます。 そうでない場合には、RESULT 変数はドロップされます (初期設定されません)。
内部ルーチンには、他の内部ルーチンの呼び出しだけでなく、それ自身に対する再帰呼び出しも含めることができます。
実際の最大値: 内部ルーチン呼び出しを含む制御構造の合計ネスト数は、使用可能なストレージによって異なります。
例
/* Recursive subroutine execution... */
arg z
call factorial z
say z'! =' result
exit
factorial: procedure /* Calculate factorial by */
arg n /* recursive invocation. */
if n=0 then return 1
call factorial n-1
return result * n
- DO ループおよびその他の構造の状況。
サブルーチン内で SIGNAL を実行すれば安全です。そのサブルーチンが呼び出されたときにアクティブであった DO ループなどが終了していないためです。 (ただし、サブルーチン内の現在アクティブなものは、終了します。)
- トレース活動。
サブルーチンがデバッグされていれば、TRACE Off をサブルーチンの先頭に挿入することができます。これは、呼び出し元のトレースには影響を与えません。 逆に、サブルーチンをデバッグしたい場合は、先頭に TRACE Results を挿入しておけば、戻り時に、サブルーチンに入った時点の条件 (例えば、Off) に自動的に復元されます。 同様に、
?(対話式デバッグ) および!(コマンド禁止) は、複数のルーチンにまたがって保管されます。 - NUMERIC 設定値。
算術演算の DIGITS、FUZZ、および FORM ( NUMERICを参照) は、保管され、戻り時に復元されます。 したがって、サブルーチンは、呼び出し元に影響を与えずに、必要な精度などを設定することができます。
- ADDRESS 設定値。
コマンドの現行および以前の宛先 ( ADDRESSを参照) は保管され、戻り時に復元されます。
- 条件トラップ。
条件トラップ (CALL ON および SIGNAL ON) は、保管され、戻る時には復元されます。 つまり、CALL ON、CALL OFF、SIGNAL ON、および SIGNAL OFF を サブルーチン内で使用しても、呼び出し元がセットアップした条件には 影響を与えません。
- 条件情報。
この情報は、現在トラップされている条件の状態および発生点について記述したものです。 CONDITION 組み込み関数がこの情報を戻します。 CONDITIONを参照してください。
- 経過時間クロック。
サブルーチンは呼び出し元から経過時間クロックを継承しますが ( TIMEを参照)、時間クロックは複数のルーチン呼び出しにまたがって保管されるため、サブルーチンまたは内部関数は、呼び出し元に影響を与えずに独立して再始動し、クロックを使用することができます。 おなじ理由のため、内部ルーチンの中で始動されたクロックは、 その呼び出し元では使用できません。
- OPTIONS 設定値。
ETMODE および EXMODE は、保管され、戻る時に復元されます。 詳しくは、 OPTIONSを参照してください。
