0.9 というか

それ以前な部分を見ている状態だったり。
main.c の L516 で呼び出されている Scm_Repl() 手続きですが

            Scm_Repl(SCM_FALSE, SCM_FALSE, SCM_FALSE, SCM_FALSE);

定義は repl.c の L192 で以下な記述。

void Scm_Repl(ScmObj reader, ScmObj evaluator, ScmObj printer,
              ScmObj prompter)
{
    Scm_ApplyRec(SCM_OBJ(&repl_STUB),
                 SCM_LIST4(reader, evaluator, printer, prompter));
}

これ、scheme 的に書くと

gosh> (apply repl_STUB '(#f #f #f #f))

みたいな形か。Scm_Repl 手続きの直上には以下な記述があって

static ScmObj repl_proc(ScmObj *args, int nargs, void *data)
{
    int argc = Scm_Length(args[0]);
    ScmObj reader =    (argc >= 1? SCM_CAR(args[0]) : SCM_FALSE);
    ScmObj evaluator = (argc >= 2? SCM_CADR(args[0]) : SCM_FALSE);
    ScmObj printer =   (argc >= 3? SCM_CAR(SCM_CDDR(args[0])) : SCM_FALSE);
    ScmObj prompter =  (argc >= 4? SCM_CADR(SCM_CDDR(args[0])) : SCM_FALSE);
    return Scm_VMRepl(reader, evaluator, printer, prompter);
}

static SCM_DEFINE_STRING_CONST(repl_NAME, "read-eval-print-loop", 20, 20);
static SCM_DEFINE_SUBR(repl_STUB, 0, 1, SCM_OBJ(&repl_NAME), repl_proc, NULL, NULL);

SCM_DEFINE_SUBR マクロの定義が gauche.h の L1328 あたりで以下。

#define SCM__DEFINE_SUBR_INT(cvar, req, opt, inf, flags, func, inliner, data) \
    ScmSubr cvar = {                                                        \
        SCM__PROCEDURE_INITIALIZER(SCM_CLASS_STATIC_TAG(Scm_ProcedureClass),\
                                   req, opt, SCM_PROC_SUBR, inf, inliner),  \
        flags, (func), (data)                                               \
    }

#define SCM_DEFINE_SUBR(cvar, req, opt, inf, func, inliner, data) \
    SCM__DEFINE_SUBR_INT(cvar, req, opt, inf, 0, func, inliner, data)

昨晩エントリにも書きましたが ScmSubr 型は ScmSubrRec 構造体を typedef したもので、この構造体は gauche.h の L1305 あたりで以下なソレ。

/* Subr - C defined procedure */
struct ScmSubrRec {
    ScmProcedure common;
    int flags;
    ScmSubrProc *func;
    void *data;
};

コメントにも記述あり。repl_proc のポインタが func 属性に設定されてます。次に呼び出されるのは Scm_VMRepl 手続き、という事になります。定義は repl.c の L164 あたりで以下。

ScmObj Scm_VMRepl(ScmObj reader, ScmObj evaluator,
                  ScmObj printer, ScmObj prompter)
{
    ScmObj ehandler, reploop;
    ScmObj *packet = SCM_NEW_ARRAY(ScmObj, 4);
    packet[0] = reader;
    packet[1] = evaluator;
    packet[2] = printer;
    packet[3] = prompter;
    ehandler = Scm_MakeSubr(repl_error_handle, packet, 1, 0, SCM_FALSE);
    reploop = Scm_MakeSubr(repl_main, packet, 0, 0, SCM_FALSE);
    Scm_VMPushCC(repl_loop_cc, (void**)packet, 4);
    return Scm_VMWithErrorHandler(ehandler, reploop);
}

このあたりきっちり追いかけておきたいんですが、今日はハナ風邪で微妙なので休みます。