dynamic-wind (2)
そもそも call/cc リハビリしてたのは dynamic-wind の実装例が云々がトリガだった。がしかし、call/cc と dynamic-wind の関連が分からん。dynamic-wind と call/cc で google 先生に聞いてみたら以下が出てきた。
- http://d.hatena.ne.jp/higepon/20080812
- http://practical-scheme.net/wiliki/wiliki.cgi?p=Scheme:generatorとdoとwhile
- http://e.tir.jp/wiliki?call%2Fcc-maniacs
うーん。とりあえず 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)) ではない?