Reading Gauche のメモ

帰宅後、Reading Gaucheかくにん。Scm_FindBinding が掘り終わっている。全部確認しつつ概要の記述にトライしてみます。
以下、かくにんなログ。
とりあえず以下に参考にしたソレを引用。

グローバル変数参照は、Scm_FindBinding (module.c) によって解決される。これは指定モジュールおよびそこから可視のモジュール中から、指定された名前に束縛されているGLOC (global location) オブジェクトを探して返すもの。
Gauche:グローバル変数参照の最適化より引用

ってよく考えたら自分が作ったナニがやりかけだし (を

仕掛り着手

うーん。こーゆー作業しながらロギングは微妙かも。余計なコトは考えず勢いでどんどんヤッてみよう。
とりあえず Scm_ModuleClass なんですが以下のマクロで定義

SCM_DEFINE_BUILTIN_CLASS(Scm_ModuleClass,
                         module_print, NULL, NULL, NULL,
                         SCM_CLASS_COLLECTION_CPL);

ええと、global で追い掛けてて微妙だったのもメモ。ええと、SCM_MODULEP を掘ったら以下のナニに jmp

#define SCM_MODULEP(obj)      SCM_XTYPEP(obj, SCM_CLASS_MODULE)

これは gauche.h で定義されているマクロ。ここから SCM_CLASS_MODULE を掘ってみると直下に定義されている

#define SCM_CLASS_MODULE     (&Scm_ModuleClass)

で、Scm_ModuleClass なんですが M-s すると

Scm_ModuleClass  1103 /home/rms/R31/boutScheme/Gauche-0.8.11/src/gauche.h       SCM_CLASS_DECL(Scm_ModuleClass);
Scm_ModuleClass  1104 /home/rms/R31/boutScheme/Gauche-0.8.11/src/gauche.h       #define SCM_CLASS_MODULE     (&Scm_ModuleClass)
Scm_ModuleClass    80 /home/rms/R31/boutScheme/Gauche-0.8.11/src/module.c       SCM_DEFINE_BUILTIN_CLASS(Scm_ModuleClass,

なカンジ。アタマの二行は gauche.h の以下の記述

SCM_CLASS_DECL(Scm_ModuleClass);
#define SCM_CLASS_MODULE     (&Scm_ModuleClass)

SCM_CLASS_MODULE マクロはスデに見てますな。SCM_CLASS_DECL マクロの定義は以下

#define SCM_CLASS_DECL(klass) extern ScmClass klass

このマクロは gauche.h で定義されています。残りは module.c で定義されてて以下

SCM_DEFINE_BUILTIN_CLASS(Scm_ModuleClass,
                         module_print, NULL, NULL, NULL,
                         SCM_CLASS_COLLECTION_CPL);

こっちが本来静的に定義しているナニですな。定義はざくっと以下

#define SCM__DEFINE_CLASS_COMMON(cname, coreSize, flag, printer, compare, serialize, allocate, cpa) \
    ScmClass cname = {                           \
        { SCM_CLASS2TAG(SCM_CLASS_CLASS), NULL },\
        printer,                                 \
        compare,                                 \
        serialize,                               \
        allocate,                                \
        cpa,                                     \
        0,        /*numInstanceSlots*/           \
        coreSize, /*coreSize*/                   \
        flag,     /*flags*/                      \
        SCM_FALSE,/*name*/                       \
        SCM_NIL,  /*directSupers*/               \
        SCM_NIL,  /*cpl*/                        \
        SCM_NIL,  /*accessors*/                  \
        SCM_NIL,  /*directSlots*/                \
        SCM_NIL,  /*slots*/                      \
        SCM_NIL,  /*directSubclasses*/           \
        SCM_NIL,  /*directMethods*/              \
        SCM_NIL,  /*initargs*/                   \
        SCM_NIL,  /*modules*/                    \
        SCM_FALSE, /*redefined*/                 \
        SCM_INTERNAL_MUTEX_INITIALIZER,          \
        SCM_INTERNAL_COND_INITIALIZER,           \
    }
    
/* Define built-in class statically -- full-featured version */
#define SCM_DEFINE_BUILTIN_CLASS(cname, printer, compare, serialize, allocate, cpa) \
    SCM__DEFINE_CLASS_COMMON(cname, 0,                    \
                             SCM_CLASS_BUILTIN,           \
                             printer, compare, serialize, allocate, cpa)

gosh で確認した所では

gosh> (map class-name (class-precedence-list <module>))
(<module> <collection> <top>)
gosh> 

という感じ。CPL は上記の順序のはず。一応概要の素案としては

module のクラス表現。組込みクラス (BUILTIN_CLASS) として定義されている。

としか書けそうにない。あと SCM_CLASS_MODULE マクロは

Scm_ModuleClass 型のアドレス

と書くしかなさげ。これを踏まえて SCM_MODULEP マクロなんですが、既存の記述をパクッて以下??

obj がクラス SCM_CLASS_MODULE のオブジェクトであれば真を戻す。

これで SCM_MODULEP 関連のナニは OK なんでしょうか。スデにへろへろなんで下書きだけ置いといて別途対応、ってコトで (とほほほ

次??

これで OK だったら次は Scm_FindBinding の掘り下げと概要の記述か。ハードル高いッス。