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 の掘り下げと概要の記述か。ハードル高いッス。