目的
プロシージャ ブロックの開始を定義し、プロシージャのパラメーターを必要に応じて指定します。
構文
name:PROCEDURE[(parameter-list][RETURNS(t)][EXTERNAL|INTERNAL]
[RECURSIVE][ORDER|REORDER][REDUCIBLE|IRREDUCIBLE]
[OPTIONS(options-list)];
注:省略形:
- PROCEDURE は PROC
- EXTERNAL は EXT
- INTERNAL は INT
- REDUCIBLE は RED
- IRREDUCIBLE は IRRED
パラメーター
- parameter-list
- プロシージャがアクティブになるときに予期する、コンマで区切られた 1 つ以上のパラメーター。各パラメーターは、PROCEDURE 文に続くプロシージャで宣言されている変数の名前を指定します。
- t
- データ型属性のリスト。
- options-list
- MAIN または VARIABLE を指定できます。
オプションは任意の順序で指定できます。
例
P: PROCEDURE(A,B) RETURNS(FIXED BINARY(15));
DECLARE(A,B) FLOAT;
DECLARE C FIXED BINARY(15);
.
.
.
RETURN ©);
END P;
Q:PROCEDURE(X) RECURSIVE;
DECLARE X CHARACTER(*);
.
.
.
CALL Q('HELLO');
END Q;
説明
PROCEDURE 文は、プロシージャ ブロックの開始を定義し、プロシージャのパラメーターを必要に応じて指定します。プロシージャが関数として呼び出される場合、PROCEDURE 文は、関数から呼び出し元に返される値のデータ型属性も指定します。前の文からの通常の制御フローの結果として PROCEDURE 文が実行される場合は効果がなく、プロシージャの END 文に続く文で実行が再開されます。
PROCEDURE 文では、プロシージャの名前を宣言するラベルを先頭に付ける必要があります。ラベルは主エントリ ポイントを宣言します。この宣言は PROCEDURE 文を含むブロック内で有効となり、そのブロック内および含まれるすべてのブロック内でその名前が既知となります。プロシージャの END 文には、終了の END 文であることが簡単にわかるようにプロシージャの名前を含めることもできます(「END Statement」のセクションを参照してください)。
parameter-list 内の各名前は、プロシージャ内で宣言する必要があり、構造体のメンバーにすることはできず、ストレージ クラス属性を使用して宣言することもできません。
OPTIONS(VARIABLE) 属性を指定せずに宣言されたプロシージャの各呼び出しは、パラメーター リスト内にあるパラメーターと同じ数の引数を含む引数リストを使用して行う必要があり、各引数は、対応するパラメーターに参照または値によって渡すことができる必要があります。
RETURNS オプションが指定されていない場合、プロシージャは、常に CALL 文で呼び出す必要があり、戻り値を指定する RETURN 文を含むことはできません。
RETURNS オプションが指定されている場合、t は、スカラー値を指定するデータ型属性のセットである必要があります。プロシージャによって返されるすべての値は、プロシージャの関数値として返される前にこのデータ型に変換されます。すべての RETURN 文では戻り値を指定する必要があり、プロシージャで独自の END 文を実行することはできません。プロシージャのすべての呼び出しは関数参照の評価に起因する必要があります。
EXTERNAL または INTERNAL は、一方しか指定できず、トップレベルのプロシージャ、つまり、他のプロシージャの範囲内に含まれていないプロシージャで指定する必要があります。EXTERNAL が指定されている場合、そのプロシージャは、コンパイルされている現在のファイルの外部となり、他の個別にコンパイルされたプロシージャから呼び出すことができます。これはデフォルトの設定です。INTERNAL が指定されている場合、そのプロシージャは、現在のコンパイル内にある他のプロシージャからのみ呼び出すことができます。その名前はこのファイル外では使用できません。
OPTIONS(MAIN) は、プログラムの実行が開始されるルーチンを明示的に定義します。OPTIONS(MAIN) 文は 1 つのプログラム内で 1 つしか使用できません。したがって、リンクされた実行可能プログラムでは、1 つのプロシージャのみがメイン プロシージャとして識別される必要があります。『Open PL/I ユーザーガイド』の「Language Concepts」の章にある「Main Procedure」のセクションを参照してください。
ORDER および REORDER は、IBM メインフレームの PL/I プログラムで最適化のために使用されることがあるオプションです。同様に、REDUCIBLE および IRREDUCIBLE は、IBM メインフレームの PL/I プログラムで使用されることがある属性です。これらはいずれも Open PL/I では不要です。Open PL/I では、これらのオプションは解析されるだけ、または無視されます。
COBOL NOMAP [map-list] オプション
FORTRAN NOMAPIN [map-list] オプション
TASK NOMAPOUT [map-list] オプション
NOEXECOPS オプション
OPTION(BYTEADDR) オプションは、ビット境界上に割り当てられた項目についてもバイト アドレスが確実に渡されるようにするために使用できます。このオプションが指定されていない場合、Open PL/I では、非整列ビット文字列のビット アドレスを渡します。このオプションが指定されている場合、Open PL/I では、非整列ビット文字列の先頭バイトのアドレスだけを渡します。
語 RECURSIVE は、文書化の目的のために指定することもできます。すべての Open PL/I プロシージャは、静的データを使用しないなど、標準的な再帰プログラミングの要件に従うことを条件に、再帰的使用が可能です。
プロシージャには、他のプロシージャ、BEGIN ブロック、および任意の他の文を含めることができます。