継続マラソン - 継続の実装方法を考える8
うーん。longjmpに逃げたいがぐっとこらえよう。
S式で考えた方が分かりやすいと昨日思ったのだけど、それはなぜだろうかと今考えてみる。
S式で考えれば
( (lambda () (display "1") ( (lambda () (display "2") (call/cc (lambda (c) (set! cont c))) (display "3"))) (display "4")))
で cont に束縛されるものは
( (lambda () ( (lambda () (display "3"))) (display "4")))
こんな感じかなと頭で考えることができます。
要するに、今 call/cc が呼ばれた Frame の外側の Frame を視覚的に見ることが出来るということが理解を助けたっぽい。
あれ?ということは、継続を上の階層に問い合わせてつなげるという方法が使えるのではなかろうか?
今の実装を生かせそうだな。
lambda(内側)は、eval されて内部的に Procedure になる。
更にその Procedure は apply されて evalSequence で eval される。
evalSequence 内で call/cc を見かけたら、自分の中の継続と、外側の親(?)に問い合わせた継続を足して保存すればよさげ。
うーん。どうだろうか。まだ迷いがある。確信がない。