0.9 な Reading が開始されている模様
とりあえず main.c の 516 行の
} else { Scm_Repl(SCM_FALSE, SCM_FALSE, SCM_FALSE, SCM_FALSE); }
から確認開始。knishii さんが掘ってるナニも確認しつつ。
ええと、Scm_Repl() 手続きの定義が以下。
# repl.c の 192 行
void Scm_Repl(ScmObj reader, ScmObj evaluator, ScmObj printer, ScmObj prompter) { Scm_ApplyRec(SCM_OBJ(&repl_STUB), SCM_LIST4(reader, evaluator, printer, prompter)); }
repl_STUB の定義は以下と思われます。
# repl.c の 190 行
static SCM_DEFINE_SUBR(repl_STUB, 0, 1, SCM_OBJ(&repl_NAME), repl_proc, NULL, NULL);
多分、SCM_DEFINE_SUBR マクロは地雷なんだろうな、と思いつつ掘り始めてみると以下。
#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)
gauche.h の 1321 行あたり。手動展開してみるにはリキが微妙。てか、このあたりは 0.8.11 って思ったら (ry
ええと、SCM__PROCEDURE_INITIALIZER マクロの定義が以下で
#define SCM__PROCEDURE_INITIALIZER(klass, req, opt, typ, inf, inl) \ { { klass }, (req), (opt), (typ), FALSE, FALSE, (inf), SCM_FALSE, (inl) }
あと、ScmSubr 型は ScmSubrRec 構造体で typedef されてて構造体の定義が gauche.h で以下。
/* Subr - C defined procedure */ struct ScmSubrRec { ScmProcedure common; int flags; ScmSubrProc *func; void *data; };
ええと、ScmProcedure 型は ScmProcedureRec 構造体で typedef されてるんですが、定義が以下ッスか。
struct ScmProcedureRec { SCM_INSTANCE_HEADER; unsigned int required : 16; /* # of required args */ unsigned int optional : 8; /* >=1 if it takes opt args. see below.*/ unsigned int type : 3; /* ScmProcedureType */ unsigned int locked : 1; /* setter locked? */ unsigned int currying : 1; /* autocurrying */ ScmObj info; /* source code info */ ScmObj setter; /* setter, if exists. */ ScmObj inliner; /* inliner information. see below. */ };
うーん。このあたり色々きっちり確認必要。