dynamic-wind と例外を考える

dynamic-wind の before や after で例外が投げられたとき、どこの rescue を起動すべきだろうか。
Scheme の意味を見てみると、「その before や after が与えられた dynamic-wind の文脈」で例外がハンドルされるみたい。つまり

enable_check = false
ctn = nil

begin
  dynamicwind(
    proc { raise if enable_check },
    proc { callcc {|c| ctn = c } },
    proc { enable_check = true }
  )
rescue
  p "foo!"
end

begin
  ctn.call
rescue
  p "bar!"
end

だと "foo!" が表示される。そのためには dymamic-wind の時点で継続をキャプチャしておく必要があって *1 、ちょっと嫌。あと、継続を呼んだ人に責任を取らせるために、この場合は "bar!" が表示されて欲しい気もする。
でも、単純に "bar!" を表示するような意味にすると

callcc do |ctn|
  dynamicwind(
    proc { },
    proc do
      begin
        ctn.call
      rescue
      end
      p "baz?"
    end,
    proc { raise }
  )
end

で "baz?" が表示されてしまいそう。after を実行した後なのに thunk を実行中というのはちょっとまずい。うーん。
考えたことをそのまま晒しただけなので落ちはない。

*1:こないだの dynamicwind の実装はそれをしてなかった。github の方は修正しといた