FUNCTION [name] [ ( [MAT] variable [ , [MAT] variable ...] ) ]
FUNCTION ステートメントは、ユーザー作成の関数を特定し、その関数に渡される引数の値と名前を指定します。 FUNCTION ステートメントは、ユーザー作成関数内にコメントがない、先頭の行にする必要があります。ユーザー作成の関数には FUNCTION ステートメントを 1 つだけ指定できます。
name は、ドキュメンテーションの目的で指定されます。関数名、または呼び出し側プログラム内の関数を参照するのに使用される名前と同じである必要はありません。name は、いずれかの有効な変数名です。
variable は、呼び出し側プログラムと関数の間で値を渡す式です。variables は、ユーザー作成関数の仮パラメーターです。実パラメーターをユーザー作成関数への引数として指定すると、そのパラメーターが仮パラメーターによって参照され、ユーザー作成関数で実行される計算で実パラメーターが使用されます。
variables は、コンマで区切ります。ユーザー作成関数には、最大で 254 個の変数を渡すことができます。 配列を渡すには、配列名の前にキーワード MAT が来るようする必要があります。ユーザー作成関数を呼び出すときは、呼び出し側の関数は FUNCTION ステートメントに指定されるのと同じ数の変数を指定する必要があります。
特殊変数は隠し変数となるので、ユーザー作成関数はそれを使用して値を返すことができます。RETURN ステートメントの (値 ) ステートメントによって値が返されるように、余分な変数がユーザー作成関数で保存されます。余分な変数は、MAP コマンドおよび MAKE.MAP.FILE コマンドによって報告されます。ユーザー作成関数で RETURN ステートメントを使用して返す数値を指定しない場合は、デフォルトで空白ストリングが返されます。
ユーザー作成関数を呼び出すプログラムには、使用前に、ユーザー作成関数を定義する DEFFUN ステートメントを含めておく必要があります。 ユーザー作成関数は、ローカル・カタログまたはシステム・カタログにカタログされているか、呼び出し側のプログラムと同じオブジェクト・ファイルのレコードでなければなりません。
ユーザー作成関数がそれ自身を関数内で再帰的に呼び出す場合は、ユーザー作成関数内で呼び出す前に DEFFUN ステートメントを指定する必要があります。
次のユーザー定義関数の SHORT は、2 つの引数の長さを比較して短い方を返します。
FUNCTION SHORT(A,B)
AL = LEN(A)
BL = LEN(B)
IF AL < BL THEN RESULT = A ELSE RESULT = B
RETURN(RESULT)
次の例は、引数または仮パラメーターの A、B、および C によって MYFUNC という関数を定義します。そのあとは、MYFUNC 関数を宣言して使用する DEFFUN ステートメントの例です。X、Y、および Z に格納される実パラメーターは、仮パラメーターの A、B、および C によって参照されるため、T に割り当てられた値の計算が可能です。
FUNCTION MYFUNC(A, B, C)
Z = ...
RETURN (Z)
.
.
.
END
DEFFUN MYFUNC(X, Y, Z)
T = MYFUNC(X, Y, Z)
END