継続呼び出し時のナニ

昨晩エントリ微妙だな。もう少し整理しておく事に。
継続が呼び出された瞬間は

  • vm->handlers は空
  • ep->handlers は ((before . after)) なリスト

という事で after は呼び出されない形。で、before 側ですが

        if (!SCM_FALSEP(Scm_Memq(SCM_CAR(p), current))) continue;

なナニは current (vm->handlers) が空なので基本 #f が戻る。ので continue されなくって以降の処理が実行されるはず。おそらくはベースで言うと

((before . '()))

になるのだろうか ...
# 昨晩のと違うな (とほほほ

続き

継続手続きの本体 (throw_cont_body) で

  • handlers の caar を呼び出すよう設定 (caar 要素を Scm_VMAplly0() に渡す)
  • handlers の cdar を vm->handlers に設定
    • 呼び出される before の中で他所の継続が呼び出された時の handler になる模様
  • 引数セットして Scm_VMPushCC() 呼び出し
    • 継続は throw_cont_cc
    • handlers の cdr 要素を data[0] に
    • ep を data[1] に
    • args を data[2] に

で、throw_cont_cc は上記でセットした data の要素を戻して throw_cont_body() を呼び出す、という事は handlers の要素を順にめくっていきながら処理していく、という事になる。handlers の要素を全部走査したらようやく継続が起動、という事かと。