throw_cont_calculate_handlers() 手続き (4)
ええと、
(dynamic-wind (before0) ((lambda () (dynamic-wind (before1) (thunk1) ;; ここで cont に継続を格納 (after1)))) (after0))
と
(dynamic-wind (before2) ((lambda () (cont))) (after2))
のナニで継続な cont を起動した瞬間の vm->handlers が以下なはず。
((after2) (before0) (before1 (before0 . after0)))
で、throw_cont_body で上記のリストが引数の handlers に渡されて car なナニを取り出しつつ順に apply している。以降でちょっとづつ整理しながら確認を。
最初のナニ
まず after2 な手続きが apply されて vm->handlers は空リスト。
むむ、なるほど。after2 では thunk を抜けてるから handlers は空で良いのか。継続が起動されても後始末は不要、という事か。これは before0 の途中で継続が起動されたケースでも同様ですな。
逆に before1 の途中で継続が起動された時点では外側の thunk の途中なので after0 が呼び出されないと、という事になる。ただ、after0 が呼び出されるかどうか、は起動される継続の状態にもよるのか。
例えば before1 の中で cont が起動されるのであれば after0 の呼び出しは不要。それ以外であれば基本的には一番最初に呼び出されないとマズい、という事ッスか。
そろそろ
ReadingGauche 方面に出力可能な状態になってるとは思うのですが、この件をどう出力するか、は微妙だなぁ。以降で下書き控えるかもしれませんが、とりあえずエントリ投入。
ReadingGauche の概要説明
- R5RS の記述の引用が必要?
- handlers って dynamic-wind の要件を満足させるためにあるのかどうかが微妙
- R5RS の使用に沿った形で throw_cont_body() において dynamic-wind に渡される before や after の thunk を apply されなければならない
- apply される before や after の thunk の中で継続が起動された時のための handlers も仕様に沿った形で作る必要がある
上記がビンゴとして、これらを網羅する形で作文するのって現時点で微妙かも。