test/dynwind.scm
タイトルがどんどん変わります。とほほです。
Test for continuation
昨晩の以下の試験ですが
(define (callcc-test1) (let ((r '())) (let ((w (let ((v 1)) (set! v (+ (call-with-current-continuation (lambda (c0) (set! c c0) v)) v)) (set! r (cons v r)) v))) (if (<= w 1024) (c w) r)))) (test "call/cc (env)" '(2048 1024 512 256 128 64 32 16 8 4 2) callcc-test1)
色々発見あり。
- 上記は読み方によっては繰り返し
- 加算の順を変えたら面白い
まだちゃんと理解できてないかも。
とりあえず確認がてら、とゆー事で c にセットされるのは
(lambda (a) (+ a x))
になる、模様。以下なカンジ。
gosh> (set! x (+ (call/cc (lambda (c0) (set! c c0) x)) x)) 2 gosh> c #<subr continuation> gosh> (c 2) 4 gosh> (c 1) 5 gosh> (c 1) 6 gosh>
ただ、単純に c は (lambda (a) (+ a v)) なんでしょうけど、以降の処理というか継続が待っています。昨日のエントリでは途中で REPL が出てきて、なんですが、上記の処理だと
- 継続に w を渡してナニ
- v に加算した値を set!
- r に (cons v r) を set!
- w に v の値を格納
- 条件分岐
と続いていくはず。なんとなくまだ腑に落ちてませんが続行。仕事な割り込み中だったりしますが続行。
加算の順を変えたら
以下な形。
(set! v (+ v (call-with-current-continuation (lambda (c0) (set! c c0) v))))
だとすると継続は
(lambda (a) (+ 1 a))
になるのではないか、と。v が評価された状態で継続がナニ。
gosh> (set! x 1) 1 gosh> (set! x (+ x (call/cc (lambda (c0) (set! c c0) x)))) 2 gosh> (c 2) 3 gosh> (c 3) 4 gosh>
たぶんビンゴ。だから順を変えたら 1 づつ、なソレになったのか。このあたりはどこかで見た記憶があったんで、すぐに分かった。
がしかし
なんとなく腑にオチてない何かがあるなぁ。今日は帰宅後ばたばたしてるのでもう少し検討してみます。dynamic-wind に到達するまでまだまだ長いです。