言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

継続とは何か2 (http://d.hatena.ne.jp/propella/20070830/p1 の続き)

shiro さんに頂いたソースコードを私なりにコメント

;; まず、c には hop を実行する前の継続が入ります。
(define c (begin (print "hip")
                 (let ((x (call/cc (lambda (y) y))))
                   (print "hop")
                   x)))
hip
hop
c
gosh> c ;; よしよし、ちゃんと入っているようだ。
#<subr continuation>
gosh> (c "Jump!!!") ;; c を実行すると、残りが実行されるのだけど、
hop
c
gosh> c ;; あれ! c が再定義されている?!
"Jump!!!"

sumim さんのコメントを参考に Squeak に翻訳してみます。未来をあとで実行するでは無くて、未来を二度実行する方法です。

"x はワークスペース変数なので宣言しない"
Transcript show: 'hip,'.
x := thisContext copyStack.
Transcript show: 'hop,'.
"ここで一旦休んで以下を実行"
x jump.

jump はコピーしたコンテキストを実行するだけなので、scheme のような凝った事は出来ませんが、一応 hop が二度表示されます。惜しい!