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 に到達するまでまだまだ長いです。