関数の概要

関数は、EGL ロジック・パーツに含まれる基本ユニットです。

1 つの関数 が、一連の EGL ステートメントを含みます。 独立型関数を除き、関数は EGL パーツではありません。関数は、プログラム内の最初に実行可能コードを含んでいるか、別の関数から呼び出されるかのいずれかです。

名前 main() は、プログラムを開始または呼び出したときに最初に実行される最上位レベルの関数用に予約されています。すべてのプログラム・パーツには、パラメーターまたは戻りの型を持たない main() という関数を含める必要があります。

関数パラメーターは、関数に渡す引数の数、型、および位置に対応します。次の 2 種類のパラメーターを使用できます。

例えば、動的配列は参照変数です。

パラメーターの宣言時に、次の 1 つ以上のパラメーター修飾子を指定できます。

関数構文およびパラメーター修飾子については、関数を参照してください。

多重定義関数

多重定義 関数は、 1 つの関数名に対して複数の関数シグニチャーを持ちます。関数のシグニチャー は、関数の名前と、そのパラメーターの数および型を組み合わせたものです。関数の戻り値は、そのシグニチャーの一部ではありません。 EGL は、同じ名前の関数が複数ある場合に、シグニチャーを使用して、関数コードを関数呼び出しに突き合わせます。EGL は 2 つの関数が同じシグニチャーを持つことを許可しません。

多くの EGL システム関数は多重定義です。例えば、1 つのパラメーターまたは 2 つのパラメーターを持つ sysLib.audit() 関数を呼び出すことができます。2 番目のパラメーターは、ジャーナル ID を指定します。 単一のパラメーターを使用してこの関数を呼び出すと、この関数はシステム・ジャーナルに書き込みます。 この 2 つの関数は次のシグニチャーを持ちます。
sysLib.audit(record BasicRecord in)
sysLib.audit(record BasicRecord in, jid SMALLINT in)
別の例としては、mathLib.abs() 関数が一定の範囲の数値型を受け入れ、同じ型の値を入力として戻します。これには、各数値型用に別々のシグニチャーが必要です。
mathLib.abs(inputVar SMALLINT)
mathLib.abs(inputVar INT)
mathLib.abs(inputVar BIGINT)
以下の前提条件が満たされる場合、多重定義関数を作成できます。
  • 関数が独立型関数になれない。
  • 多重定義関数は同じパーツに存在する必要があります。 同じ名前の関数が 2 つのパーツに含まれている場合は、これらの関数のシグニチャーが異なるとしても、 関数名を非修飾で参照することはできません。
  • 関数シグニチャーは戻り値を含まないため、戻り値以外が同一の 2 つの関数を 持つことはできません。
生成処理中に、EGL は以下の規則を使用して非修飾関数名の参照を解決します。
  1. EGL は、現在の有効範囲から、名前が一致するすべての関数を検索します。
  2. EGL が複数のコンテナー (論理パーツ) で一致する関数名を検出すると、生成プログラムはあいまい参照エラーを表示します。
  3. 複数の関数が、パラメーターの数と一致すると、EGL はステップ 4 まで続行します。一致する関数がないと、生成プログラムは無効な引数エラーを表示します。
  4. EGL は、関数呼び出しに含まれる引数の型が一致するパラメーターを持つ関数を検索します。 一致しない場合、EGL はステップ 5 まで続行します。検証エラーの原因になるため、EGL では一致する関数を複数見つけることはできません。
  5. EGL は、関数呼び出しで引数との代入の互換性があるパラメーターを持つ関数を検索します。一致しない場合、生成プログラムは無効な引数エラーを表示します。複数の一致が検出された場合、EGL はその中で一致度が最も高いものを検索します。 例えば、引数が SMALLINT で、EGL が INT パラメーターを持つ関数と BIGINT パラメーターを持つ関数の 2 つの関数を検出した場合、EGL は INT パラメーターを持つ関数の方を選択します。これは、INT の方が SMALLINT にサイズが近いためです。EGL がこのような一致を検出できなかった場合、生成プログラムはあいまい参照エラーを表示します。

フィードバック