OPTIONAL

OPTIONAL 属性は、パラメーター記述子リストの一部として、またはパラメーター宣言の属性として指定できます。

OPTIONAL

OPTIONAL 引数を呼び出しおよび関数参照で省略するには、アスタリスク (*) を使用します。引数リストのどの位置にある項目でも省略することができます。省略された項目は引数として数えられます。引数の数は、エントリに許可されている最大数を超えてはいけません。

受け取り側のプロシージャは、OMITTED または PRESENT 組み込み関数を使用して、OPTIONAL パラメーター/引数がエントリの呼び出しで省略されたかどうかを判別できます。

エントリの宣言の対応するパラメーターも OPTIONAL であれば、省略された OPTIONAL パラメーターをそのエントリの引数として渡すことができます。

ENTRY 宣言の最終パラメーターが OPTIONAL として宣言されている場合、それらのパラメーターは ENTRY の呼び出しで省略することができます。それらのパラメーターを呼び出しで省略する際に、対応する数のアスタリスクを指定する必要もありません。そのため、たとえば、6 つのパラメーターを含む ENTRY の宣言で、そのうちの最後の 3 つが OPTIONAL として宣言されている場合、3 つ、4 つ、5 つ、または 6 つの引数を指定して呼び出すことができます。

この例では、いくつかのオプションのパラメーターを含む一連の呼び出しを繰り返します。各呼び出しで OPTIONAL パラメーターが指定されているかどうかが OMITTED 組み込み関数を使用して判別され、結果が出力されます。

pgm: proc options (main);

dcl subr entry ( fixed bin, char(1) optional, float, char(40) optional);
dcl c char(1);

call subr(99, *, 3.14, 'OPTIONAL attribute & OMITTED built-in');
call subr(99, *, 3.14, *);
call subr(99, c, 3.14);
call subr(99, *, 3.14, *);
call subr(99, c, 3.14, 'Done.');

end pgm;

subr: proc (i, c1, f, str);

dcl i    fixed bin,
    c1   char(1) optional,
    f    float bin,
    str  char(40) optional;

if omitted(str) then
    put skip list('Arg str Omitted.');
else
    put skip data(str);

if omitted(c1) then
    put skip list('Arg c1 Omitted.');
else
    put skip list('Arg c1 not Omitted.');

put skip list ('--------');

end subr;

このコード例を実行すると、次のように出力されます。

STR='OPTIONAL attribute & OMITTED built-in   ' ;
Arg c1 Omitted.
--------
Arg str Omitted.
Arg c1 Omitted.
--------
Arg str Omitted.
Arg c1 not Omitted.
--------
Arg str Omitted.
Arg c1 Omitted.
--------
STR='Done.                                   ' ;
Arg c1 not Omitted.
--------