範囲式は、次の例に示すように、型付き変数によって、その型付き変数の型定義から継承されます。型付き変数の次元および要素の長さは、範囲式の現在の値によって決まります。
/* TYPE DEFINITION */ DECLARE CHARX(N,N) CHAR( LENGTH(STRING) ) BASED, N FIXED BINARY(15), STRING CHAR(80) VARYING; /* TYPED VARIABLE */ DECLARE ARRAY TYPE(CHARX) BASED;
配列を参照する際の範囲の評価は、基底付き変数の評価に適用される規則と同じ規則に従います。次の例では、CHARX とは異なるブロックで可変長配列が宣言されています。
/*--------------------------------------------------*/ START: PROCEDURE; DECLARE CHARX(N,N) CHAR( LENGTH(STRING) ) BASED, N FIXED BINARY(15), STRING CHAR(80) VARYING; . . . /*--------------------------------------------------*/ NEXT: PROCEDURE; DECLARE ARRAY TYPE(CHARX) BASED, N FIXED BINARY(15), STRING CHAR(80) VARYING; . . . END NEXT; /*--------------------------------------------------*/ . . . END START; /*--------------------------------------------------*/
前記の例の場合、Open PL/I では、NEXT プロシージャの宣言を使用して ARRAY の範囲式が評価されます。TYPE 属性を使用して宣言されていない変数であっても、常に現在のブロック内にある宣言を使用して範囲式が評価されます(前記の例では、NEXT プロシージャで N および STRING を宣言しなかった場合、START プロシージャの変数宣言が使用されることになります)。
REFER オプションを型定義で使用する場合は、以下が適用されます。
たとえば、次の部分的なプログラムでは、VAR1 は型定義であり、VAR2 は対応する型付き変数です。BASED 属性および REFER オプションが VAR1 の宣言で指定されています。したがって、VAR2 の宣言で BASED 属性を指定する必要があります。
DECLARE N FIXED BIN(15); /* TYPE DEFINITION: */ DECLARE 1 VAR1 BASED, 2 SIZE FIXED BIN(15), 2 ITEMS( N REFER(VAR1.SIZE) ) CHAR(80); DECLARE VAR2 TYPE(VAR1) BASED;
展開すると、次のようになります。
DECLARE 1 VAR2 BASED, 2 SIZE FIXED BIN(15), 2 ITEMS (N REFER (VAR2.SIZE)) CHAR(80);
たとえば、前記の部分的なプログラムでは、VAR1.ITEMS を型定義として使用することはできません。
たとえば、前記の部分的なプログラムでは、VAR1.SIZE は、REFER オプションの参照であるため、型定義 VAR1 のメンバーである必要があります。また、VAR2 の宣言を展開した形式では、VAR1.SIZE の代わりに VAR2.SIZE が REFER(reference) として指定されています。