GENERIC は、一連のエントリ参照およびその記述子に対して汎用名を宣言する場合に使用するデータ型属性です。形式は次のとおりです。
generic-name GENERIC (references)
references は次のとおりです。
entry-reference-1 WHEN (generic-descriptor) entry-reference-2 WHEN (generic-descriptor) entry-reference OTHERWISE
generic-descriptor は、FIXED、FLOAT、BINARY などのデータ属性です。
使用できる追加の属性は、ALIGNED、UNALIGNED、ASSIGNABLE、NONASIGNABLE、INOUT、INONLY、OUTONLY、CONNECTED、NONCONNECTED、BIGENDIAN、および OPTIONAL です。属性 ASSIGNABLE、NONASIGNABLE、CONNECTED、または NONCONNECTED (あるいはそれらの組み合わせ) は、指定しても無視されます。
エントリ参照は、添え字付けまたは定義することはできません。同じエントリ参照を、単一の GENERIC 宣言内で異なる記述子のリストを使用して複数回指定できます。
各汎用記述子は、単一の引数に対応します。対応する引数に必要な属性を指定して、関連するエントリ参照を置換用に選択できるようにします。
構造体または共用体は指定できません。
記述子が不要な場合は、アスタリスクで表されます。呼び出し文にすべての引数がないことを表す記述子がある場合は、エントリの WHEN 句の汎用記述子を省略して表現されます。
汎用名の呼び出しが検出されると、呼び出しで指定された引数の数およびその属性が、セット内の各エントリの記述子リストと比較されます。数および属性の両方で引数と記述子リストが一致する最初のエントリ参照が、汎用名と置き換わります。
次の例では、属性 FIXED、BINARY、FLOAT、DECIMAL の任意の組み合わせに一致する記述子が 1 つだけあるエントリ参照が検索されます。一致するエントリがない場合は、OTHERWISE 句が選択されます。
*PROCESS FLAG(I);
mysqrt: proc options(main);
dcl sqrt generic (
mf_sqrti when (fixed bin),
mf_sqrtf when (float dec),
mf_sqrtd when (float bin),
mf_sqrterror otherwise );
dcl i fixed bin(15) init(9),
j fixed bin(31) init(16),
f float dec(6) init(25.0),
d float bin(52) init(36.0);
call sqrt(i);
call sqrt(j);
call sqrt(f);
call sqrt(d);
call sqrt('e');
mf_sqrti: proc (x);
dcl x fixed bin(31);
put skip list (procedurename() || ' selected.');
end;
mf_sqrtf: proc (x);
dcl x fixed dec(16);
put skip list (procedurename() || ' selected.');
end;
mf_sqrtd: proc (x);
dcl x float bin(52);
put skip list (procedurename() || ' selected.');
end;
mf_sqrterror: proc(g);
dcl g char;
put skip list (procedurename() || ' selected.');
end;
end;
実行すると、次のように出力されます。
MF_SQRTI selected. MF_SQRTI selected. MF_SQRTF selected. MF_SQRTD selected. MF_SQRTERROR selected.
正確な数の記述子に正確な属性が指定されているエントリが見つからない場合は、OTHERWISE 句が指定されたエントリが選択されます (存在する場合)。
同様に、引数の次元に基づいてエントリを選択できます。
*PROCESS FLAG(I);
test: proc options(main);
dcl dims generic (
dim1 when (fixed, (*)), /* 1st param has fixed attr, 2nd param has one dimension */
dim2 when (fixed, (*,*)), /* 1st param has fixed attr, 2nd param has two dimensions */
err otherwise );
dcl a fixed bin;
dcl b float bin;
dcl arr1 (20) fixed bin;
dcl arr2 (10,2) fixed bin;
call dims(a, arr1); /* dim1 called */
call dims(a, arr2); /* dim2 called */
call dims(b, arr2); /* err called, 1st param mismatch */
dcl dim1 entry(fixed bin, (*) fixed bin) ext;
dcl dim2 entry(fixed bin, (*,*) fixed bin) ext;
dcl err entry(any, any) ext ;
end;
すべての記述子が省略されているか、アスタリスクで構成されている場合は、正しい数の記述子を持つ最初のエントリ参照が選択されます。
汎用値への参照で引数として使用されるエントリ式は、ENTRY 型の記述子のみに一致します。そのような記述子がない場合、プログラムはエラーになります。