1 つの関数 が、一連の EGL ステートメントを含みます。 関数は、プログラム内の最初に実行可能コードを含んでいるか、別のプログラムから呼び出されるかのいずれかです。
関数自体は EGL パーツではありません (独立型関数は特殊な場合です。独立型関数パーツを参照してください)。
関数の概要については、関数の概要を参照してください。
関数には、以下の要素を組み込むことができます。
- 括弧で囲んだパラメーターのセット。それぞれのパラメーターは、関数が別の関数から呼び出された際に渡される引数に対応します。
関数にパラメーターがない場合でも、関数名の後には一組の括弧を付けなければなりません。
- 戻りの型。関数が呼び出し関数に戻すデータの型を表します。関数に戻りの型がない場合、データを戻すことができないので、それを関数それ自体が値を持つ式で使用できません。サービスにおいては、戻りの型を ANY、BLOB、または CLOB 型にすることはできません。戻りの型には、受け取り側変数のデータ型と互換がある必要があります。詳細については、returnを参照してください。
- ローカル変数のセット。それぞれがその関数内でのみ意味を持ちます。ローカル変数について詳しくは、有効範囲を参照してください。
- EGL 文。
- 終了区切り文字。
名前 main() は、プログラムを開始または呼び出す場合に常に最初に実行される最上位レベルの関数に予約されます。すべてのプログラム・パーツには、パラメーターまたは戻りの型を持たない main() という関数を含める必要があります。
パラメーターを宣言する場合、それぞれを関数への入力 (in) として使用する、関数からの出力 (out) として使用する、あるいはその両方 (inOut) として使用する、という選択肢の中からいずれかを指定する必要があります。
いずれも指定しない場合は、inOut 修飾子がデフォルトになります。
その他の修飾子には、const、field、および sqlNullable があります。詳しくは、このトピックの『パラメーター修飾子』を参照してください。
EGL では、2 つの関数が同じシグニチャー (関数名およびパラメーターの数と型の組み合わせ) を持つことはできません。多重定義関数 (名前は同じでも別のシグニチャー) は許可されます。詳しくは、多重定義関数を参照してください。
構文
- functionName
- この関数に割り当てる名前。
- parameters
- 関数が呼び出される際の引数のリストに対応する、変数名、型、およびオプションの修飾子のリスト (このトピックの『パラメーター修飾子』を参照)。
パラメーターはコンマで区切る必要があります。パラメーターはオプションですが、括弧は必須です。
- type
- 関数が戻す値を表す型。
この型は、呼び出し側関数で戻り値を受け取る変数の型に一致している必要があります。これは、プリミティブ型、データ項目、辞書、またはレコードになる場合があります。
次に、呼び出し関数が変更されたレコードにアクセスすることができます。
- statement
- EGL 文。
パラメーター修飾子
パラメーターの宣言時に、次の 1 つ以上のパラメーター修飾子を指定できます。
- const は、入力引数が定数として扱われることを示します。
- field は、テキスト書式フィールドまたは印刷書式フィールドがパラメーターに渡されることを示します。
- in、out、および inout は相互に排他的です。これらは、パラメーターが入力用であるか、出力用であるか、両方のためのものであるかを示します。
- sqlNullable は、VisualAge® Generator からマイグレーションされるコード専用であり、(データベース・アクセスに使用される) 引数を NULL にできることを示します。
複数の修飾子を指定する場合は、以下の順序で指定してください。
- sqlNullable (const と互換性があり、in または inout のいずれかを選択した場合、または const、out がない場合に互換性があります)
- const (sqlNullable と、in または inout のいずれかと互換性があります)
- field (inout と互換性があります)
- in、out、または inout
以下に、修飾子に関する詳細を示します。
- const
- この修飾子は、関数がパラメーターの値を変更しない場合に使用します。const を使用する場合は、EGL エディターは値を変更できないようにします。場合によっては、生成されるコードはより効率的であることがあります。
プリミティブまたは動的配列であるパラメーターには const 修飾子を使用できます。inout によって変更されるパラメーターに定数を渡す場合は、常に const を使用してください。
制約事項: - const 修飾子に out または field 修飾子を付けることはできませんが、sqlNullable 修飾子を付けることはできます。
- const 修飾子は、以下の関数のパラメーターには使用できません。
- コンストラクターまたは外部型内のその他の関数
- サービスまたはネイティブ・ライブラリー内の関数
- グローバルに定義される変数が、const によって変更される関数パラメーターに渡された場合は、関数内ではそのような変数の更新は避けてください。
以下の例では、myParameter の値は、グローバルに定義される変数の更新によって変更される場合と変更されない場合があります。
program example
myGlobal int = 4;
function main()
myFunction (myGlobal);
end
function myFunction(myParameter INT const in)
// print 4, twice
sysLib.writeStdOut(myGlobal);
sysLib.writeStdOut(myParameter);
// update the global variable and print 17
myGlobal = 17;
sysLib.writeStdOut(myGlobal);
// print the parameter value, which may be 4 or 17
sysLib.writeStdOut(myParameter);
end
end
- 関数内のパラメーターが const によって変更され、その他の関数内の同等のパラメーターが const によって変更されない場合は、その関数には委譲との互換性はありません。
以下に例を示します。
Delegate MyDelegatePart( za int in, zb int const in ) end
Function F1( xa int in, xb int const in ) end
Function F2( xa int const in, xb int const in ) end
Function F3( xa int in, xb int in ) end
Function example()
myDelegateVariable MyDelegatePart;
myDelegateVariable = F1; // OK
myDelegateVariable = F2; // Invalid: xa has const, za does not
myDelegateVariable = F3; // Invalid: zb has const, xb does not
end
- field
- この修飾子は、テキスト書式フィールドまたは印刷書式フィールドを関数に渡す場合に使用します。field 修飾子を指定する場合は、blanks、cursor、または numeric などの書式フィールドの特性についてパラメーターをテストできます。以下の例のように、set ステートメントでパラメーターを使用できます。
set myField red, bold;
明示的に指定されている場合も、デフォルトで指定されている場合も、field 修飾子には inout パラメーターを付ける必要があります。field 修飾子には const 修飾子を付けることはできません。
- in
- パラメーターが関数の入力として使用される場合に、この修飾子を使用します。in を指定した場合、関数は引数値を入力として
受け取りますが、呼び出し側関数は、パラメーターに加えられた変更を受け取りません。
現行の関数の中で、または現行の関数によって呼び出される関数の中で、ファイルまたはデータベースにアクセスするレコードに in を指定することはできません。
- 有限長ストリングを、修飾子が in
である関数仮パラメーターとして指定する場合、すべてのテキスト入力が有効です。
- 引数に含まれる文字数がパラメーターで有効な文字数よりも多い場合、EGL はコピーされたコンテンツを切り捨てて使用可能な長さに合うようにします。
- 引数に含まれる文字数がパラメーターで有効な文字数よりも少ない場合、EGL は指定された長さと一致するよう、コピーされたコンテンツをブランクで埋め込みます。
- 引数が参照型の場合は、対応する関数パラメーターにコピーが渡されます。パラメーターに割り当てた値は、参照が指している値には影響しません。一方、パラメーターの元の値を変更せずに配列の要素を変更すると、呼び出し側プログラムが変更を検出します。プログラムが変更を検出するのは、パラメーターがまだ元の引数が指すのと同じ領域のメモリーを指しているためです。
- out
- パラメーターが関数からの出力として使用される場合に、この修飾子を使用します。
この関数は引数値を入力として受け取らず、パラメーターは、『データの初期化』で説明されている規則に従って初期化されます。
関数が戻るときは、呼び出し側プログラムの引数に値が代入されます。
- 引数がリテラルまたは定数である場合、パラメーターは修飾子が in
であるかのように扱われます。
現行の関数の中で、または現行の関数によって呼び出される関数の中で、ファイルまたはデータベースにアクセスするレコードに out を指定することはできません。
- 有限長ストリングを、修飾子が out である関数パラメーターとして指定する場合、長さの制限は、パラメーターと引数の両方で同じである必要があります。
- 引数が参照型の場合は、対応する関数パラメーターに NULL 参照が渡されます。パラメーターに割り当てた値によって、呼び出し側関数の対応する変数が更新されます。
- inOut
- パラメーターが関数の入力および出力の両方として使用される場合に、この修飾子を使用します。この関数は引数値を入力として受け取り、呼び出し側の関数は関数の終了時に、
パラメーターに加えられた変更があれば、それをすべて受け取ります。
引数がリテラルまたは定数である場合、パラメーターは修飾子が in
であるかのように扱われます。
- 引数がレコードである場合は、以下の規則が適用されます。
- このレコードを使用して、現行の関数、または現行の関数によって呼び出される関数の中でファイルまたはデータベースにアクセスする場合は、inOut 修飾子を指定するか、デフォルトでその修飾子を受け入れる必要があります。
- レコード・タイプがパラメーターと引数について同じであり (例えば、両方とも EmpRecord 型である)、かつ inOut が有効になっている場合は、endOfFile 状況など、レコード固有の状態情報は関数内で使用可能であり、呼び出し側に戻されます。
- 引数が参照型の場合は、対応する関数パラメーターに参照として渡されます。パラメーターに割り当てた値によって、呼び出し側プログラムの対応する変数が更新されます。
- sqlNullable
- 詳細については、『sqlNullable』を参照してください。