ここで行われているのは、カリー化と呼ばれるものです。n 個の複数の引数を取る関数を、一連の関数として呼び出せるように変換します。
2 つの引数を取る関数 f、つまり f(x,y) を考えてみましょう。f(x,y) = g(x)(y) =(g(x))(y) となる単項関数 g が存在します。関数 g は、f のカリー化バージョンとして知られています。
g は 1 つの引数 (x) を期待する関数であり、g(x) の値も 1 つの引数 y の関数です。
カリー化された加算関数を考えてみましょう:
(define curried-add
(lambda (x)
(lambda (y) (+ x y))))
((curried-add 1) 5)
(curried-add 1) の呼び出しは、1 つの引数 (この場合は 5) を取り、それを 1 に加算して 6 を出力する関数を返します。
これらのカリー化された追加を連鎖させて、以下を取得できます。
((curried-add ((curried-add 1) 2)) 3)
6 の出力が生成されます。これは、(curried-add 1) が 1 つの引数、この場合は 2 を期待する関数を返すためです。したがって、1 が 2 に追加され、1 つの引数を期待する関数が生成されます。 3 作ったばかりです。
この場合、真と偽の関数です。
真は次のとおりです。(define t (lambda (x) (lambda (y) x)))
偽は次のとおりです。(define f (lambda (x) (lambda (y) y)))
true 関数は 2 つの引数を取り、最初の引数を返します。false 関数は 2 つの引数の 2 番目を返します。