yojikのlog

yojikのブログです

匿名クラスはクロージャではない、らしい

だってクラスだもん。というのは置いておいて
http://www.programmers-paradise.com/tdiary/?date=20060118#p03
リンク先の方は、なかなか真面目に考えていますね。(生産的では無いけど)
Javaでクロージャというのが(いろんな書き方を試してみる)ネタ企画だと思っていたので軽い気持ちで突っ込んでしまいました。非常にもうしわけないデス。つまりクロージャ相当のことができればよい、というスタンスかなと。
僕が単にクロージャと呼ぶ時は、ローカルの環境を(何らかの方法で)関数に閉じ込めて外側に持ち出せればOKだというスタンスです。スコープの外側の変数に対してのアクセスがリードオンリーになっちゃったり変な制限がついてもまぁいいかなと。
ただ飲み会の時に言語戦争になった場合など、もう少し厳密に真剣に考える必要がある場合は、レキシカルクロージャといって区別してます。
リンク先の方は、基本的にはレキシカルクロージャみたいなのを想定していて、レキシカルスコープが使えない、例えば古いPythonのクロージャ等はモドキであるというスタンスみたいですね。ただレキシカルクロージャの場合でも、外部の参照を付け替えるような破壊的な変更はあんまりしないほうがいいと思う。Lisper的にはどうなんだろ。ポール・グ(ラハ|レア)ムはおもいっくそやってるけど。
↓ここらへんにも議論が起きてます。
http://robotics.naist.jp/~osamu-m/d/?date=20050930
ただ世の中には、とりあえずJavaにはクロージャ無いからダサイぜ使わん、とかいう人も多いわけで、簡潔な代替手段を示してあげたい、というマジメな気持ちもあります。なんかJavaの言語仕様のダサさを指摘すれば通っぽいとされる風潮があるのがイヤ*1。きちんと考えて書けば結構いい感じにかけるよ、と。 *2
まー将来の言語仕様でどうなるかわからんわけですが。
ちなみにPnutsはレキシカルクロージャもイテレータもジェネレータも完備。格好いいでしょ。

*1:被害妄想かな

*2:追記:この件に関しては突っ込んだ先が悪かったと後悔