継続は計算処理終了後の将来像を表現したものであるということ

SICPのambの実装を読む前にambの実装を想像するとambは継続を使わなければ実現出来ないような気がします。
そこで継続の動作を復習したのですが、やっぱり全然理解出来ていませんでした。
復習した結果として「継続は計算処理終了後の将来像を表現したもの」ということが少しわかったので書いておきます。


scheme修行にある継続の例を元にしてリストの中身を一つだけ取り出す処理を書いてみました。

(define (walk-list l)
  (let ((leave '()))
    (call-with-current-continuation
     (lambda (here)
       (set! leave here)
       (let loop ((l l))
	 (if (null? l)
	     (leave '())
	     (begin
	       (call-with-current-continuation
		(lambda (rest)
		  (set! fill rest)
		  (leave (car l))))
	       (loop (cdr l)))))))))

(define fill)

(define (test . x)
  (walk-list x)
  (fill 1))

これをこのように実行するとリストの2番目の要素を取得出来ると考えたのですが、
実際には無限ループにはまって帰ってこなくなってしまいました。

(test 1 2 3)

これがなぜ終了しないのかわからなかったのですが、考えれば当たり前の話です。
fillに再束縛した継続が次にしようとしていた計算はloopの評価とfillの評価なんですね。
fillを評価すると再帰的にfillの評価が呼び出されるのでそりゃ戻ってきません。


継続は計算処理終了後の将来像を表現したものである、とのことですがちょっと意味がわかった気がします。


プログラミング言語SCHEME

プログラミング言語SCHEME

  • 作者: R.ケントディヴィグ,R.Kent Dybvig,村上雅章
  • 出版社/メーカー: ピアソンエデュケーション
  • 発売日: 2000/05
  • メディア: 単行本
  • 購入: 2人 クリック: 71回
  • この商品を含むブログ (20件) を見る
Scheme修行

Scheme修行