プロシージャとクロージャ

クロージャ

Javascriptなどで利用されるクロージャ機能はCurlにもあります。これは匿名プロシージャとも呼ばれます。これにはprocマクロを利用します。また、プロシージャとして型定義を指定するために、proc-typeマクロが用意されています。この機能を具体例に沿って説明していきたいとおもいます。

{curl 6.0 applet}

{value
    let p:{proc-type {int, int}:int} =
        {proc {a:int, b:int}:int
            || 足し算の結果を返す
            {return a + b}
        }

    {output {p 10, 20}} || 30
    {output {p 5, 30}}   || 35
}

ここでは、単純な足し算のクロージャを例にとって説明します。まず、クロージャを作成するには、procマクロを利用します。procマクロの引数に、実際に必要な引数(ここで足し算する2つの値aとb)を”{“と”}”で囲み、その後戻り値を”:”の後に記載します。あとは、中身のロジックを記載していきます。(ここでは足し算をし、結果を返すというものです。)また、このクロージャ自体を変数に代入する場合(上記の例では、pという変数に代入)、変数の型を定義するため、上記のようにproc-typeマクロを利用します。

このプロシージャを実行するには、変数名を”{“と”}”で囲み、実行します。例えば、上記のように{p 引数, 引数}のようにいます。また、この変数をさらに他のプロシージャやメソッドの引数として指定できますので、Javascriptでよく利用されるコールバック関数的な使い方もできます。

グローバル・プロシージャ(関数)

Curlでは、グローバルな関数(プロシージャ)も作成することができます。具体例を以下に記載します。

{curl 6.0 applet}

{define-proc public {add a:int, b:int}:int
    || 足し算の結果を返す
    {return a + b}
}

{value
    {output {add 20, 30}}
}

これを作成するには、define-procマクロを利用します。あとは、メソッドを作成するようのと同様に記載し、利用いたします。(もちろんpublic以外のプロシージャも作成できます。)

ラムダ式

C#でもサポートされているラムダ式がCurlでも利用できます。これによりプロシージャを利用する際、コード量を減らすことができます。サンプルは以下のようになります。

|| 通常のプロシージャ
def x = {proc {i1:int, i2:int}:int
              {return i1 * i2}
           }

|| ラムダ式(fnというマクロ。C#と同様=>演算子を利用します。
def x = {fn i1, i2 => i1 * i2}

 

関連ドキュメント

匿名プロシージャと引数