dynamic-wind。

dynamic-windについてまとめた。

dynamic-windのつかいかた

(dynamic-wind before thunk after)
  • 引数はすべてthunk(引数0の手続き)。
  • before、thunk、afterの順に実行する。
  • ただし、真ん中のthunkで継続を取り出して外側から呼び出した場合や中から外側の継続を呼び出した場合は特別な動きをする。
  • 外側から継続を呼び出した場合、呼び出す前にbefore、後にafterを呼ぶ。
  • 内側から外側の継続を呼び出した場合その継続が呼ばれる前にafterを呼ぶ。(もちろんbeforeはその前に呼ばれている)


実行例

(define cont #f)

(dynamic-wind 
  (lambda () (display 1))
  (lambda  () (display (call/cc (lambda (c) (set! cont c) 2))))
  (lambda () (display 3)(newline)))

(cont 0)

結果

123
103

やること。
beforeで1を表示、afterで3と表示して改行
真ん中のthunkで、継続を取り出してその結果を標準出力する。
そして外側から継続を呼ぶ。