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 も仕様に沿った形で作る必要がある

上記がビンゴとして、これらを網羅する形で作文するのって現時点で微妙かも。