継続のケイゾク

call/ccは副作用らしい』を書いてから一月経った。その間、何もしていなかったかと言うと、これについては何もしていなかった。卒論をやっていたのだ*1
卒論も目処がついてきたので2、3日前から再び考え始めたのだが、さすがに一月も経つと何が分からなかったのかすら分からないという状態。日記を読む限りではlambda式の意味関数あたりが理解できなかったようだ。覚えてないなあ。
課題が分からないのではやりようがないので、仕方なく、http://theory.csail.mit.edu/classes/6.844/spring05-6844/handouts/project3.pdfを読んでいた(パラパラめくっていた)ら、あることに気付いたデスヨ。すなわち、「継続はそれ以降の処理を表している」ということに気付いたのだ。いや、もちろんこのこと自体は知っていたのだが、ちゃんと理解していないからか、なぜか「継続は次の処理のみを表している」と考えていることがあるのだ。機械語で言えば、次のプログラムカウンタ(NPC)にあたる継続を次の命令語そのものと認識していたということだ(この例は分かりやすいのだろうか?)。
これで、一月前、何が分からなかったのかを思い出した。Ε[E0 E*]が分からなかったのだ。E*の継続はupdateやassignのようなものではないから環境、またはストアに影響を与えないのではと思ったのだ。ここでは継続を次の処理だけであると誤って認識してしまっているのである。継続がそれ以降の処理と考えれば、ちゃんとupdateされる(たぶん)ので問題ない。
いくら何でも、この理解の悪さはマズイ。本当にこれが分からなかったことなのか。そうではないことを切に願う。

*1:今もやっている