gauche-0.9

昨晩掘削したあたりは 0.8 系と変わりは無いのかな。
すごいざっくりな情報でスミマセン。とりあえず Scm_VMRepl で

  • repl_loop_cc 手続きが継続に push されて
  • repl_main 手続きが実行されつつ、エラー (例外) 発生時には repl_error_handle 手続きが呼び出される

という事のはず。
repl_main 手続きの定義は repl.c の L131 にて以下な定義。

static ScmObj repl_main(ScmObj *args, int nargs, void *data)
{
    ScmObj *closure = (ScmObj*)data;
    ScmObj prompter = closure[3];
    
    if (SCM_PROCEDUREP(prompter)) {
        Scm_VMPushCC(repl_prompt_cc, data, 4);
        return Scm_VMApply0(prompter);
    } else {
        Scm_Write(SCM_MAKE_STR("gosh> "),
                  SCM_OBJ(SCM_CUROUT), SCM_WRITE_DISPLAY);
        Scm_Flush(SCM_CUROUT);
        return repl_prompt_cc(SCM_UNDEFINED, (void**)data);
    }
}

渡される data は全て #f なはずなので else 句のナニが実行されるはず。repl_error_handle 手続きは以下で。

static ScmObj repl_error_handle(ScmObj *args, int nargs, void *data)
{
    SCM_ASSERT(nargs == 1);
    Scm_ReportError(args[0]);
    return SCM_TRUE;
}

おそらくこれって

gosh> x
*** ERROR: unbound variable: x
Stack Trace:
_______________________________________
gosh> 

なナニではないかと類推。違うかもしれませんが。このエントリは完全に類推ベースです。色々掘削必要です。