Re: クロージャ
[id:sumii:20070524:p2]
クロージャについては、昔あれこれ調べたり考えたりしていたので
-
-
- -
-
Landinの論文やschemeの仕様のあたりだけに限定していると、レキシカルスコープを実現する上での、実装上のテクニックという理解で矛盾なく説明できるのです。
SICPとかでもそのように説明していますし。
http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-15.html#footnote_Temp_154
-
-
- -
-
ところが、Smalltalkの世界に行くと、クロージャという言葉のニュアンスがすこし違ってきて、ブロックという構文に対応するクラスとしてBlockContextとBlockClosureという2つのクラスがあって、この2つの違いについて、「ブロックがクロージャであるかどうか」という言い方が生まれたのではないかという気がします。
-
-
- -
-
さらに、Wikipediaになるとはっきりと
http://en.wikipedia.org/wiki/Closure_%28computer_science%29
a closure is a semantic concept
と書いていますし、The Haskell 98 Reportにも
http://www.haskell.org/onlinereport/modules.html#sect5.5.3
http://www.sampou.org/haskell/report-revised-j/modules.html#sect5.5.3
5.5.3 クロージャ
ひとつの Haskell プログラム内のすべてのモジュールは閉じたもの でなければならない。すなわち、ソースコードによって明示的に言及さ れたすべての名前は局所的に定義されているか、あるいは、別のモジュール からインポートされたものであるかどちらかでなくてはならない。
となって、ここに至って、クロージャという概念がレキシカルスコープと同じ意味で使われるところまで意味が拡大してきたという風に見て取れます。
-
-
- -
-
ここまでは、「拡大」解釈であるというふうに(私は)納得できるのですが、拡大ではなくて転用だと思われる新しい概念でも使われるようになっていて、
SmalltalkerでありRubyistであるMartinのBlikiにはクロージャのページがあって、
http://capsctrl.que.jp/kdmsnr/wiki/bliki/?Closure
基本的にクロージャとは、ブロック化されたコードのことを指します。コードブロックは関数呼び出しの際に引数として使うことができます。
という表現で使われるようになって、Closures for Javaの提案では、
http://gafter.blogspot.com/2006/08/closures-for-java.html
Anonymous Functions (Closures)
We also introduce a syntactic form for constructing a function value without declaring a local function (precedence is tentative):
となり、いわゆる無名関数のことをクロージャという言い方が市民権を得てきたように見えます。