とほほ

もの凄いナチュラルぶちカマシてます。

確かに引数の数が違うな

って書いてますが、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 だった。多分これが原因だな。(とほほほ