パーツの参照

このセクションでは、名前が参照するパーツを EGL が識別する方法を決定する一連の規則について説明します。 これらの規則は、以下の状況で重要です。

2 番目の規則のセットは、EGL が変数参照を解決する方法を決定します。 詳細については、『変数および定数の参照』を参照してください。

基本的可視性規則

最も単純なケースでは、それぞれのパーツを別々のパッケージで宣言せずに、単一パッケージ内に順次定義します。 以下のリストは同じ階層レベルにある一連のパーツを示しています (詳細は省略されています)。

   Function:  Function01
   Function:  Function02
   Function:  Function03
   Record:    Record01

同じレベルにあるパーツは相互に使用可能です。例えば、Function01 は他の関数のいずれかまたは 両方を呼び出すことができます。また、Record01 は 3 つのそれぞれの関数で変数に 対する typedef として使用できます。

ほとんどの場合、パーツは他のパーツにネストできません。 以下のような例外があります。
  • プログラム、ライブラリー、または pageHandler は、関数をネストできます。ただし、包含関係は直接的である必要があります。 関数は、他の関数をネストできません。
  • 書式グループは書式をネストできます。
次の例は、ネストされたパーツを使用した例です。
   Program:  Program01
     Function:  Function01
     Function:  Function02
   Function:  Function03
   Record:    Record01
最上位のパーツは、パッケージ内の他のすべてのパーツが利用できます。 ただし、ネストされたパーツ (Function01 および Function02) は、そのパッケージ内のパーツのサブセットのみが以下のように利用できます。
  • 相互に利用可能
  • ネストしているパーツ、およびネストしているパーツが実行時に使用する関数で利用可能 例えば Function01 が Function03 を起動する場合には、Function03 は Function02 を起動できます。これは、Function03 が Program01 で使用されるためです。

最後に、ユーザーのコードにテキスト書式または印刷書式が含まれている場合には、 これらの書式を含む書式グループにアクセスするには、使用宣言が必要です。 使用宣言は、データ・テーブルまたはライブラリーをアクセスする場合にも推奨されます。 詳しくは、『使用宣言』を参照してください。

追加可視性規則

ほとんどの開発では、複数のパッケージで共有するパーツが使用されています。 これらの規則が有効になります。

パーツ名の解決

パーツ参照を解決するために、EGL は 1 つのステップから多数のステップまで含む検索を実施します。 以下の文は、各ステップ に適用されます。
  • 検索は、一意の名前を持つパーツが検索された場合には正常終了する
  • 検索は、2 つの同じ名前を持つパーツが検索された場合には異常終了する
これらの状況が考えられます。
  • パーツ参照は、パッケージ名を使用して修飾されている。この場合には、 検索に含まれるステップは常に 1 つのステップです。
  • パーツ参照は、パッケージ名では修飾されておらず、関数呼び出しではない。
  • パーツ参照は、パッケージ名では修飾されておらず、関数呼び出しである。
次の文が重要となるのは多くありませんが、最後の 2 つの状況のいずれかに適用される場合があります。
  • 参照元のパーツ内のプロパティー containerContextDependent は、yes に設定することができます。 『containerContextDependent』の説明のように、このプロパティーを設定して、参照の解決で使用するネーム・スペースを拡張します。
  • ユーザー関数の 1 つが、プログラムまたはページ・ハンドラーで可視になっていて、EGL システム関数名と同じ名前を持っている場合には、システム関数ではなく、そのユーザー関数が参照されます。

パッケージ名が指定されている場合のパーツ名の解決

前述のとおり、例 my.package.myPart のような形式で、パーツの参照時にパッケージ名を指定できます。 現行プロジェクトは、EGL ビルド・パスにリストされているプロジェクトのいずれかとして扱われます。

その参照が、同じパッケージ内にあるパーツからの参照の場合には、 以下の文が適用されます。
  • パッケージ名は有効 (ただし必須ではない)
  • パーツ名は、パーツが private として宣言されている場合でも解決される

パッケージ名が指定されていない場合のパーツ名解決 (関数呼び出しを除く)

パーツが関数ではなくパーツを参照していて、パッケージ名が指定されていない場合には、 検索順序のステップは次のようになります。
  1. 参照元のパーツがネストされているコンテナーと同じコンテナーにネストされているパーツを検索する。
  2. 参照しているパーツが存在するファイルに明示的にインポートされたパーツを検索する。 現行プロジェクトは、EGL ビルド・パスにリストされているプロジェクトのいずれかとして扱われます。

    この場合の各 import ステートメントは、特定のパッケージ内の特定のパーツを明示的に参照します。このような明示的 import ステートメント で指定されたパーツは、現行パッケージの同じ名前のパーツをオーバーライドするよう動作します。

    2 つの異なるプロジェクト内に同じ名前のパッケージが存在する場合、指定された明示型の import ステートメントは、EGL ビルド・パスを使用して最初の検索を行い、必要なパーツが見つかると検索を停止します。 (パーツは、あるプロジェクト内のパッケージに対して固有である必要があります。) 2 つの異なるプロジェクト内で同じ名前のパッケージが存在してもエラーではありませんが、混乱を招くことになりお勧めできません。

    同じパーツ名を指定した 2 つの明示型 import ステートメントがある場合、エラーが発生します。

  3. 参照元のパーツと同じパッケージにある最上位パーツを検索する。現行プロジェクトは、EGL ビルド・パスにリストされているプロジェクトのいずれかとして扱われます。同じ名前の 2 つのパーツを検索すると、エラーが発生します。
  4. 他のインポートされたパーツを検索する。現行プロジェクトは、EGL ビルド・パスにリストされているプロジェクトのいずれかとして扱われます。

    この場合の各 import ステートメントは、指定パッケージ内のすべてのパーツを参照し、ワイルドカード import ステートメント と呼ばれます。

    2 つの異なるプロジェクト内に同じ名前のパッケージが存在する場合、指定されたワイルドカード import ステートメントは、EGL ビルド・パスを使用して最初の検索を行い、必要なパーツが見つかると検索を停止します。 (パーツは、あるプロジェクト内のパッケージに対して固有である必要があります。)

    複数のワイルドカード import ステートメントが同じ名前のパーツを検索すると、エラーが発生します。

パッケージ名が指定されていない場合の関数呼び出し

パーツが関数を呼び出し、パッケージ名を指定していない場合には、 検索順序のステップは次のようになります。
  1. 起動側がネストされているコンテナーと同じコンテナーにネストされている関数を検索する。
  2. コンテナーの使用宣言で指定されているライブラリー内に常駐する関数を検索する。
  3. 生成時にコンテナーに組み込まれた関数のみを使用して検索を継続する。 (同一のコンテナーにネストされている、またはライブラリーに常駐している関数以外の関数を組み込むには、 コンテナー・プロパティー includeReferencedFunctionsyes に設定します。)
    組み込み関数の検索は、次のように行われます。
    1. コンテナーが存在するファイルに明示的にインポートされたパーツを検索する。 現行プロジェクトは、EGL ビルド・パスにリストされているプロジェクトのいずれかとして扱われます。

      この場合の各 import ステートメントは、特定のパッケージ内の特定のパーツを明示的に参照します。このような明示的 import ステートメント で指定されたパーツは、現行パッケージの同じ名前のパーツをオーバーライドするよう動作します。

      2 つの異なるプロジェクト内に同じ名前のパッケージが存在する場合、指定された明示型の import ステートメントは、EGL ビルド・パスを使用して最初の検索を行い、必要な関数が見つかると検索を停止します。 (関数は、あるプロジェクト内のパッケージに対して固有である必要があります。) 2 つの異なるプロジェクト内で同じ名前のパッケージが存在してもエラーではありませんが、混乱を招くことになりお勧めできません。

      同じパーツ名を指定した 2 つの明示型 import ステートメントがある場合、エラーが発生します。

    2. コンテナーと同じパッケージ内の最上位関数を検索する。現行プロジェクトは、EGL ビルド・パスにリストされているプロジェクトのいずれかとして扱われます。同じ名前の 2 つのパーツが検出されると、エラーが出ます。
    3. 他のインポートされたパーツを検索する。現行プロジェクトは、EGL ビルド・パスにリストされているプロジェクトのいずれかとして扱われます。

      この場合の各 import ステートメントは、指定パッケージ内のすべてのパーツを参照し、ワイルドカード import ステートメント と呼ばれます。

      2 つの異なるプロジェクト内に同じ名前のパッケージが存在する場合、指定されたワイルドカード import ステートメントは、EGL ビルド・パスを使用して最初の検索を行い、必要なパーツが見つかると検索を停止します。 (パーツは、あるプロジェクト内のパッケージに対して固有である必要があります。)

      複数のワイルドカード import ステートメントが同じ名前のパーツを検索すると、エラーが発生します。

プログラムの呼び出し

call または transfer 文でプログラムを呼び出す場合、呼び出し側の引き数リストは、呼び出し先プログラムのパラメーター・リストと一致している必要があります。引き数およびパラメーターのミスマッチがある場合には、エラーになります。

ご利用条件 | フィードバック
(C) Copyright IBM Corporation 2000, 2005. All Rights Reserved.(C) Copyright IBM Japan 2005.