クロージャとは関数と変数の束縛の組みです。C等の言語の関数は クロージャから変数の束縛を取ったものと言えるでしょう。
クロージャはlambdaによって作ることができます。 文法は以下のようになります。
((arguments... ) expressions... lambda)
argumentsに束縛される変数を記述します。その束縛された環境下で expressions...の内容が実行されます。最後のlambda(とそのエイリアス) でクロージャを生成することを示します。
以下に例を示します。
「(x y) 「(x y ひく) を 表示」 の 仕事」
これでx、yの2引数を取るクロージャが作製できました。
クロージャは前に引数を置いたリストを評価することによって実行されます。
「5 2 「(x y) 「(x y ひく) を 表示」 の 仕事」」 ---> 3.0
クロージャは他のオプジェクト同様変数に束縛できます。
「foo を 「(x y) 「(x y ひく) を 表示」 の 仕事」 と 定義 します」 「3 1 foo」 ---> 2.0 「10 4 foo」 ---> 6.0
クロージャはクロージャが生成された環境を束縛しています。 クロージャ内での変数の束縛はクロージャが生成された時点のものが使用されます。
以下に例を示します。
「加算器生成 を 「(n) 「(x) 「n x +」 の 仕事」 の 仕事」 と 定義 します」 「3加算器 を 「3 加算器生成」 と 定義します」 「「2 3加算器」 表示」 ---> 5.0 「「10 3加算器」 表示」 ---> 13.0
この例ではシンボル加算器生成器を一つの引数nを取り、 一つの引数を取るクロージャを返すクロージャに束縛しています。 (1行目)
2行目では「3 加算器生成」で1行目のnに3が束縛された 「(x) 「3 x +」 の 仕事」が返されます。これが3加算器に束縛され 3行目、4行目の結果になります。