proc (マクロ)
パッケージ: CURL.LANGUAGE.COMPILER

匿名プロシージャを作成します。

シグネチャ

{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}
}