PACKAGE 文を省略すると、次のコード サンプルに示すように、1 つの Open PL/I ソース ファイルに 1 つ以上の外部プロシージャを含めることができます。
PKG: PACKAGE EXPORTS (SUB1 EXTERNAL(‘PLB’));
SUB1: PROC; /* will be external, callable as “PLB”) */
CALL SUB2();
END SUB1;
SUB2: PROC; /* will be internal, not exported */
PUT SKIP LIST (‘PACKAGE NAME = ‘, PACKAGENAME());
END SUB2;
END PKG;
1 つのソース ファイルに含まれる外部プロシージャは、すべて同じオブジェクト ファイルにコンパイルされます。
モジュールは、オブジェクト コードにコンパイルされるソース ファイルとなる 1 つのコンパイル単位として定義されます。モジュールは 1 つ以上の外部プロシージャで構成されます。
ソース ファイルでは、対象の変数がいずれも BASED、STATIC、または DEFINED であれば、それらの宣言をすべての外部プロシージャの範囲外に記述することができます。この方法で定義された変数は、すべての外部プロシージャの範囲内であると見なされます。宣言で EXTERNAL 属性を指定した場合は、ソース ファイルの外部であると見なされます。
ソース ファイルでは、最初の外部プロシージャの前に、%REPLACE 文および名前付き定数 (ファイル定数や入り口定数など) の宣言を記述することもできます。
次の例は、最初の外部プロシージャの前に宣言および %REPLACE 文を含むソース ファイルを示しています。このソース ファイルには、プログラムの一部として使用できる 2 つのプロシージャ (GETREC および PUTREC) が含まれています。Open PL/I では、これらの入り口定数 GETREC および PUTREC はデフォルトで EXTERNAL 属性として宣言されます。したがって、このソース ファイルの外部の別のモジュールに含まれるプロシージャから GETREC または PUTREC を呼び出すことができます。GETREC および PUTREC を別のモジュールのプロシージャで参照する必要がある場合は、そのモジュール内で属性 ENTRY および EXTERNAL を使用して宣言する必要があります。
このソース ファイルの先頭にある他の項目 (REC、NAME、ADDRESS) は、他のモジュールでコンパイルされたプロシージャからは認識されず、GETREC および PUTREC にのみ認識されます。Open PL/I では、ファイル定数はデフォルトで EXTERNAL 属性として宣言されるため、ファイル DATA_BASE は他のモジュールからも参照できます。
%REPLACE DATA_SIZE BY 80;
DECLARE 1 REC BASED
2 NAME CHAR(40),
2 ADDRESS CHAR(DATA_SIZE);
DECLARE DATA_BASE KEYED FILE UPDATE;
GETREC: PROCEDURE(P);
DECLARE P POINTER;
READ FILE(DATA_BASE) INTO(P->REC);
END GETREC;
PUTREC: PROCEDURE(P);
DECLARE P POINTER;
REWRITE FILE(DATA_BASE) FROM(P->REC);
END PUTREC;