メールはスパムと判定されることがあります。最初は、信頼されているドメインから差し障りのない文面を送っていただけると、スパムと判定されにくいと思います。「クロージャ、それなに?」ってエントリーで、「『クロージャ』って言葉の意味がわからない」と言ったのですが、lethevertさんからのトラックバックやshiroさんのコメントで多少は状況が見えてきました。sumiiさんの解決しかかったところで余計なことをいって混乱に拍車をかけてみる。確かに混乱はしたものの、さらにlethevertさんの解説が続いたので、自分なりの目星はついた気がします。最近の傾向ラムダ式(に相当するもの)やデータのように扱えるコードブロックをクロージャと呼ぶのが最近の傾向みたいですね。プログラミング言語の機能/能力として捉えることが多いようです。「ナントカ言語はクロージャが使える」みたいな用法で。多くの人がそういう意味で使うなら、「本来は...」みたいなこと言ってもしょうがないので、別にいいや。sumiiさんの言う「データ構造の一つ」に近い理解です。いつどこでそう思い込んだかは憶えていませんが、いずれにしても昔の話なので、「クロージャ」の意味が拡散する前のことでしょう(とは言っても、ランディンのオリジナル論文とかは全然知りません*1)。表現していることになります。1}は記号表(名前・値マップ)のつもりです。記号表は環境とも呼びます*2。書いても同じ状況を表します。僕が気になっていたことは、ラムダ式(無名関数)の非ローカル変数の扱いです。function)を作る関数です。一次関数の定義時(makeAffineLinearを呼び出したとき)、aは確定しますがbは確定するとは限りません。このように、bの値がどうにでもできる点が僕は気持ち悪くて「クロージャと呼んでいいのか?」と疑問を感じていたのですが(次に続く)。非ローカル変数の束縛makeAffineLinearの例で、一次関数が作られる時点で、実はaとbの束縛は決定されています。bの値が欲しいときにどこを探せばいいかが分かっていることです。変数の名前から変数の値を求めるには記号表を引きますが、どの記号表を引けばいいかが決まるってことです。いう呼び出しで(通常の言語のスタックフレームに相当する)呼び出しオブジェクトが生成されます。引数変数も含めたローカル変数は、この呼び出しオブジェクトのプロパティです。呼び出しオブジェクトに名前はありませんが、仮に_callだとすると、ローカル変数aの値は_call["a"]で求まります。_call)でaの束縛は決定されます。_call["b"]は値を持ちません。JavaScriptのルールでは、非ローカル変数は常に大域変数です*3。大域変数は大域オブジェクトのプロパティです。b)のbを求めるには記号表_globalを引きます。_callに値がなければ_globalを引くことになります。みたいなデータが作られたわけ。b)にくっついているデータと見ていいでしょう。束縛は決まっても値は変えられるbの値が後から自由に設定できるのは、記号表_globalがたまたまミュータブル(変更可能)だったからです。細工をすると、ローカルなaさえも後から変更できます。x;}を経由して呼び出しオブジェクトの内部をいじってます。値を支配している記号表はずっと同じものを使い続けます。閉じているからクロージャ?これで、makeAffineLinear(2)で生成(定義)されたラムダ式では、非ローカル変数の束縛(使用する記号表)は決定済みだが、その記号表が変更可能なら値は変わるかもしれない事情はわかりました。こりゃクロージャですね。冒頭で述べた昨今の傾向からすれば、そんなことにこだわる必要は全然ないのかもしれません。実は、「閉じている」って言い方の語源のほうでいまだに僕は混乱しているのですが、そのハナシは別な機会にします。*1:ランディン(Landin)という人名は耳にしたことがあります。昔、「ランディンがどうたら」「ストレーチィがこうたら」とか言っていた人がいたので。「どうたらこうたら」部分はまったく憶えてない。assignment)と呼ぶこともあります。*3:ブラウザ内で動作するときは違ったスコーピングになることもあり得ます。*4:実際には、処理系実装ごとに固有の名前が付いてます。微分の計算は色々な場面で必要です。:圏的ラムダ計算の立場から考える引数を持たない純関数と定数って、区別すべきでしょうか。1はてなブログをはじめよう!m-hiyamaさんは、はてなブログを使っています。ブログを報告する引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。