throw_cont_calculate_handlers() 手続き (3)
ええと昨晩の続き。
(dynamic-wind (before0) ((lambda () (dynamic-wind (before1) (thunk1) ;; ここで cont に継続を格納 (after1)))) (after0))
な thunk1 で補足された継続を
(dynamic-wind (before2) ((lambda () (cont))) (after2))
みたいなカンジで継続が呼び出された場合は
- after2
- before0
- before1
な順で呼び出されるべき、で良いのかな。
継続補足時の vm->handlers は
((before1 . after1) (before0 . after0))
で、これが補足された継続呼び出し時に ep->handlers に復帰される。あるいは継続呼び出し時の vm->handlers は
((before2 . after2))
になってますので throw_cont_calculate_handlers() 手続きでは
((after2) (before1 (before0 . after0)) (before0))
になるのか。あ、違うや。こう?
((after2) (before0) (before1 (before0 . after0)))
しかも昨晩のエントリも微妙に間違えてますな。throw_cont_calculate_handlers() から戻るリストは
((after3 (before2 . after2)) (after2) (before0))
なのか。
そりゃええんですが
vm->handlers に空でないリストがセットされる場合、handler の中で継続が補足されたり違う場所で補足された継続が呼び出されたりした時、どうなるんでしょうか。
例えば上記の before1 の実行中にぜんぜん別なナニの継続が呼ばれた場合は thunk1 に入ってないので after0 が呼び出されれば良い、というのが以下のリストの意図ですか。
((after2) (before0) (before1 (before0 . after0)))
うーん。ここって ReadingGauche 方面への反映をどうしたものやら。