実は恥ずかしながらクロージャというものがイマイチ何だか分からないというか、何の為に使うのか、何で便利なのかとかまったくもって分からなかったのだが、先日ハッカーと画家 コンピュータ時代の創造者たちの第13章「オタク野郎の復讐」のプログラム比較例を見ていたら突然理解が進んだ。
—–
以下はPythonの例として載っていたもの。
def foo(n): s = [n] def bar(i): s[0] += i return s[0] return bar
これを実行すると以下のようになる。
>>> f1 = foo(5) >>> f2 = foo(7) >>> f1(6) 11 >>> f1(10) 21 >>> f1(25) 46 >>> f2(8) 15 >>> f2(40) 55 >>> f2(-4) 51 >>>
この結果は僕にとって衝撃的だった。いや、結果が衝撃的なのではなくて「こんなプログラミングの仕方があるのか」という衝撃を強く受けた。そしてこの例を通してクロージャの使い方や何故それが使われるのか、他の言語に比べてそれがPythonだとそこまでエレガントに書けないなどといったことが色々分かってきた。
今の一番の疑問というか好奇心の的は、コンパイラやインタプリタがどのようにクロージャを実現しているのか、もっと具体的に言うとグローバル変数のごときキープされている変数(例で言うとs)は一体どこにどのように保持されているのか、だ。C言語でクロージャを実現する例などの情報が色々とネットで見つけたので、少し勉強してみたいと思う。
以下、参考にしたサイト。
Wikipedia : 高階関数
Wikipedia : クロージャ
Collection & Copy : 関数、オブジェクト、クロージャ
dW : Linux : Pythonでの関数プログラミング: 第2回