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); }
このあたりきっちり追いかけておきたいんですが、今日はハナ風邪で微妙なので休みます。