匿名プロシージャを作成します。
シグネチャ
{proc {[arg-def-list]}[:return-type]
code-body
}
arg-def-list: は、匿名プロシージャに対する引数リストです。
arg-def-list の構文と意味は、Curl のすべての関数と同じです。匿名プロシージャは次の引数カテゴリ、リストされた引数と残余引数の両方をサポートします。さらに次の引数フォーマット、位置引数とキーワード引数の両方をサポートします。引数についての情報 (構文および意味を含む) は、Curl 開発者ガイドの「
引数」の章を参照してください。
return-type: 匿名プロシージャが返す値のデータ型を指定します。匿名プロシージャは、1 つまたは複数の戻り値をサポートしています。匿名プロシージャは、説明を目的とする戻り値の名前の使用もサポートしています。
code-body: は、匿名プロシージャのボディです。
code-body はコード ブロックです。コード ブロックは、1 つ以上の Curl 式で構成されます (
return 式が含まれることもあります)。匿名プロシージャが 1 つ以上の値を返すように定義されている場合、
return 式が存在しなくてはなりません。
return 式が存在する場合、
return 式の値が匿名プロシージャの呼び出し元に返されます。
説明
匿名プロシージャは、Curl プログラミング言語の強力な拡張機能です。Curl 言語は Lisp や Scheme プログラミング言語から、別の言語機能をいくつか取り入れています。
匿名プロシージャが他のプロシージャと異なる点は次のとおりです。
- 名前を持つ必要がありません。
- 任意のコード ブロックまたは式で宣言できます。
- プロシージャ本体の外にある変数にアクセスできます。
そのタイトルから予測できるように、匿名プロシージャはプロシージャ名を持ちません。
特定の場所でしか宣言できないメソッドやプロシージャとは異なり、匿名プロシージャは任意のコード ブロックまたは式で宣言できます。これは、匿名プロシージャを正規のプロシージャやメソッドの本体で使用できることを意味します。また、必要に応じてトップレベルの Curl コードで匿名プロシージャを使用することもできます。
プロシージャまたはメソッドは、その関数のスコープ内に含まれる変数にのみアクセスできます。つまり、プロシージャまたはメソッドは、グローバル変数、パラメータとしてその関数に渡される変数、およびローカル変数にしかアクセスできないことを意味します。匿名プロシージャの最もパワフルな機能の 1 つは、匿名プロシージャ定義を含むコード ブロックのスコープ内で定義されている変数にアクセスできることです(この特徴は、レキシカル変数の閉鎖サポートとも呼ばれます)。
匿名プロシージャについての詳細 (その使用方法など) は、Curl 開発者ガイドの「
匿名プロシージャ」のセクションを参照してください。
例
匿名プロシージャが整数引数を受け取り、整数値を返す例を次に示します。ここでは引数の値を 3 倍して戻り値にしています。
|| An anonymous procedure that takes one int (x) as
|| an argument and returns an int.
{proc {x:int}:int
|| Return 3 multiplied by the value of the argument.
{return 3 * x}
}
複数の値を返す匿名プロシージャの例を次に示します。
|| An anonymous procedure that takes one int (x) as
|| an argument and returns two int values.
{proc {x:int}:(int, int)
|| Return two values:
|| 1) 2 multiplied by the value of the argument
|| 2) 3 multiplied by the value of the argument
{return 2 * x, 3 * x}
}