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 を実行中というのはちょっとまずい。うーん。
考えたことをそのまま晒しただけなので落ちはない。