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

プロシージャ データ型を作成します。

シグネチャ

{proc-type {[arg-type-list]}[:return-type-list]}
arg-type-list: はプロシージャに対する引数のデータ型リストです。連続する複数のデータ型を区切るには、コンマを使います。
return-type-list: はプロシージャの戻り値のデータ型です。プロシージャが値を返さない場合は、必ず void を指定します。プロシージャが値を 1 つ返す場合は、その値のデータ型を指定します。プロシージャが複数の値を返す場合は、データ型のリストをかっこで囲み、連続する複数のデータ型をカンマで区切ります。複数の値を返すプロシージャの場合、戻り値のデータ型の指定に識別子を追加できます。この識別子は、コードの読者に各戻り値のコンテンツを知らせるという目的以外の意味はありません。つまり、識別子はコードの読者に対してドキュメントの役割を果たします。

return-type を指定しなかった場合、any 型の戻り値を 1 つ指定したものと見なされます。

説明

明白ではありませんが、Curl の関数には必ずデータ型が設定されています。プロシージャにはデータ型が設定されているので、プロシージャを次の用途に使うことができます。



プロシージャのデータ型を作成するには、proc-type プリミティブを使います。プロシージャのデータ型は、引数リスト、および戻り値の指定の両方に利用できます。

次のコードは匿名プロシージャを指す変数を宣言し、初期化します。

{do
    || Declare the variable my-proc to be a procedure
    || that takes one int argument and returns an int.
    let my-proc:{proc-type {int}:int}

    || Set my-proc to the anonymous procedure that
    || takes one int (x) as an argument and returns
    || an int.
    set my-proc = {proc {x:int}:int
                      {return 3 * x}
                  }
}


次のように変数の宣言と初期化を組み合わせることもできます。

{do
    || Declare the variable my-proc to be a procedure
    || that takes one int argument and returns an int
    || and initialize it with an anonymous procedure.
    let my-proc:{proc-type {int}:int} =
        {proc {x:int}:int
            {return 3 * x}
        }
}


また、名前の指定されたプロシージャを使用することもできます。

{define-proc {twice x:int}:int
    {return x * 2}
}

{do
    || Declare the variable my-proc to be a procedure
    || that takes one int argument and returns an int
    || and initialize it with a named procedure:
    let my-proc:{proc-type {int}:int} = twice

    || Call it.
    {output {my-proc 3}}
}