とほほ
もの凄いナチュラルぶちカマシてます。
確かに引数の数が違うな
って書いてますが、0.8.6 と 0.8.11 で違うだけなのに (ry
それにしても
grep の結果によれば
intlib.stub:(define-cproc global-call-type (id cenv)
なので global-call-type の引数は二つ、という理解で良いはず。だとしたら
$ gosh -I . -l compile.test.scm -E 'select-module gauche.internal.test' *** ERROR: Compile Error: wrong number of arguments for #<subr global-call-type> (required 1, got 2)
と叱られるのは微妙。もうすこし確認してみると grep かけたら intlib.c にて
intlib.c: SCM_DEFINE(module, "global-call-type", SCM_OBJ(&intlib_global_call_type__STUB));
という形で define されていると思われる。これは Scm_Init_intlib() 手続きで呼び出されている (という書き方が適当なのかどうか微妙)。その Scm_Init_intlib() 手続きは Scm_Init() から呼び出されてます。Scm_Init() は main.c の main() メソドから呼び出されております。
で
上記の intlib_global_call_type__STUB というオブジェクトは intlib.c にて以下な定義らしい。
static SCM_DEFINE_SUBR(intlib_global_call_type__STUB, 2, 0, SCM_OBJ(&scm__sc.d633[17]), intlib_global_call_type, NULL, NULL);
ええと、SCM_DEFINE_SUBR マクロの定義は以下
#define SCM_DEFINE_SUBR(cvar, req, opt, inf, func, inliner, data) \ ScmSubr cvar = { \ SCM__PROCEDURE_INITIALIZER(SCM_CLASS2TAG(SCM_CLASS_PROCEDURE), \ req, opt, SCM_PROC_SUBR, inf, inliner), \ (func), (data) \ }
む。おそらく上記マクロの req は引数の数クサい。ええとさらに SCM__PROCEDURE_INITIALIZER マクロの定義は以下
#define SCM__PROCEDURE_INITIALIZER(klass, req, opt, typ, inf, inl) \ { { klass }, (req), (opt), (typ), FALSE, (inf), SCM_FALSE, (inl) }
あるいは、struct ScmSubrRec 型の定義が以下
/* Subr - C defined procedure */ struct ScmSubrRec { ScmProcedure common; ScmSubrProc *func; void *data; };
ええともひとつ struct ScmProcedureRec 型の定義が以下
struct ScmProcedureRec { SCM_INSTANCE_HEADER; unsigned char required; /* # of required args */ unsigned char optional; /* 1 if it takes rest args */ unsigned char type; /* procedure type */ unsigned char locked; /* setter locked? */ ScmObj info; /* source code info */ ScmObj setter; /* setter, if exists. */ ScmObj inliner; /* inliner. NB: for backward compatibility, this may be initialized by NULL. */ };
引数二つなんだけどなぁ、と言いつつ gosh のバージョン見たら 0.8.7 だった。多分これが原因だな。(とほほほ