パッケージとは、宣言、デフォルト・ステートメント、およびプロシージャー・ブロックだけ入れることができるブロックのことです。 名前が再び宣言されない限りは、パッケージは、パッケージ内に含まれる すべての宣言およびプロシージャーによって共用される名前の有効範囲を構成します。 レベル 1 のプロシージャーの一部またはすべてが搬出され、 外部プロシージャーとしてパッケージの外で認識できるようになります。 パッケージは、複数のエントリー・ポイント・アプリケーションを実施する際に使用することができます。
MAIN プロシージャーを含んだパッケージは、FETCHABLE プロシージャーも含めてはいけません。 MAIN プロシージャーを含んだパッケージは、DLL にリンクすることもできません。 このパッケージは、必要に応じて DLL のルーチンを呼び出すことができる基本実行可能モジュールの一部を形成する必要があります。 もちろん、このようなパッケージでは、静的にリンクされた他のルーチンから呼び出すことができる外部ルーチンも定義できます。 また、このパッケージでは、静的にリンクされた他のルーチンから参照可能な EXTERNAL STATIC データも定義できます。
(MAIN ルーチンを含んでいない) パッケージは、DLL にリンクされ、DLL のそのパッケージからエクスポートされる唯一の EXTERNAL STATIC 変数は、RESERVED 属性を持つ変数になります。
PACKAGE ステートメントの例は、図 3 に示されています。
*Process S A(F) LANGLVL(SAA2) LIMITS(EXTNAME(31)) NUMBER;
Package_Demo: Package exports (Factorial);
/***********************************************/
/* Common Data */
/***********************************************/
dcl N fixed bin(15);
dcl Message char(*) value('The factorial of ');
/***********************************************/
/* Main Program */
/***********************************************/
Factorial: proc options (main);
dcl Result fixed bin(31);
put skip list('Please enter a number whose factorial ' ||
'must be computed ');
get list(N);
Result = Compute_factorial(n);
put list(Message || trim(N) || ' is ' || trim(Result));
end Factorial;
/***********************************************/
/* Subroutine */
/***********************************************/
Compute_factorial: proc (Input) recursive returns (fixed bin(31));
dcl Input fixed bin(15);
if Input <= 1 then
return(1);
else
return( Input*Compute_factorial(Input-1) );
end Compute_factorial;
end Package_Demo;