dynamic-wind の仕様を読みつつ理解しよう

動的寿命 1

  • 呼び出された手続きの本体が始まる時,その動的寿命に入る
  • 呼び出された手続きが戻る時,その動的寿命は終わる
(dynamic-wind
 (lambda () (display "a"))
 (lambda () (display "b"))
 (lambda () (display "c")))
abc#<undef>
gosh> 

動的寿命 2

  • 動的寿命の期間外にとらえられた継続が,実行がその動的寿命の中にあるときに起動されたならば,その時もまた,その動的寿命は終わる。
(define cont '())
cont
(begin
 (display "1")
 (display (call/cc (lambda (c) (set! cont c) "2")))
 (display "3"))

123#<undef>
(dynamic-wind
 (lambda () (display "a"))
 (lambda () (display "b") (cont "2 again"))
 (lambda () (display "c")))
abc2 again3#<undef>

動的寿命3

  • (call/cc を使って) 動的寿命の期間中にとらえられた継続が,実行がその動的寿命の中にないときに起動されたならば,その時もまた,その動的寿命に入る。
(define cont '())
cont
(dynamic-wind
 (lambda () (display "a"))
 (lambda ()
   (display "1")
   (display (call/cc (lambda (c) (set! cont c) "2")))
   (display "3"))
 (lambda () (display "c")))
a123c#<undef>
gosh> (cont "2 again")
a2 again3c#<undef>