dynamic-wind (2)

そもそも call/cc リハビリしてたのは dynamic-wind の実装例が云々がトリガだった。がしかし、call/cc と dynamic-wind の関連が分からん。dynamic-wind と call/cc で google 先生に聞いてみたら以下が出てきた。

うーん。とりあえず test/dynwind.scm を見てみるか。

むむ

よく考えたら、gauche 理解するために test 配下を見てみるのは大切だな、とゆーコトに dynwind.scm 見て気がついた。ちょっとバージョン的に弱いですがこれは面白い。
一発目が以下。

(define c #f)

;;-----------------------------------------------------------------------
;; 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 にナニされる継続が何かが分かれば良い?

c にセットされる継続

ちなみに

               (set! v (+ v
                          (call-with-current-continuation
                           (lambda (c0) (set! c c0) v))))

ってしてみたら 1 づつ加算なリストが出てきました。何が違うのでしょ。

c に束縛されるナニは単純に (lambda (a) (+ a v)) ではない?