[SML 7597] クロージャ

Hiroshi Umeoka umrlazybind @ gmail.com
2009年 7月 5日 (日) 06:39:01 JST


おはようございます、梅岡です。
先日の京都の勉強会、Smalltalkのブロッククロージャを興味深く拝聴しました。
個人的な話しで恐縮なのですが、FortranとCしか知らない駆け出しの頃、何気なく新宿紀伊国屋で手にしたマグロウヒルの「プログラムの構造と実行」という本でクロージャを目にし、読んでみて驚愕したのがついこの間のことのようです。
プログラムが実行されるスタックやらコンテキストを意識するようになったのはそれからでした。
その例題は、確かこんな感じでした。
(本はLisp系言語であるSchemeで書かれていましたが、ここではSmalltalkで挑戦です:-)


| accountTemplate accountX accountY |

"口座を定義。ブロックを返すブロック"
accountTemplate :=
    [:initial |
    | amount |
        amount := initial.
        [:withdraw |
            amount := amount - withdraw] ].

"初回の預け入れで口座を複数開設"
accountX := accountTemplate value: 1000.
accountY := accountTemplate value: 6666.

"各口座からの引き出しと残高表示"
Transcript
	cr;
	show: (accountX value: 30) printString;
	cr;
	show: (accountY value: 222) printString.
	cr;
	show: (accountY value: 111) printString.


----
970
6444
6333
----

amount がインスタンス変数のように機能しますね。まるでブロックがオブジェクトのように振る舞っています。クロージャって面白いっ、と単純に思いました。
ちなみに、このとき以来Schemeにハマったのですが、このクロージャの次に衝撃を受けたのが、竹岡さんのユニマガの連載「マジカルミステリーツアーいたしましょ」のSchemeの「継続(Continuation)」で並行処理を書く記事でした。
(最近ああいう記事を載せる雑誌が見当たらなくて寂しいです)


SML メーリングリストの案内