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;