Fomentを読む(7)
2016-11-08
Tech一月経ったので続きを。前回はCompileSyntaxRules, ExpandSyntaxRulesのシグネチャを調べたのだった。
- CompileSyntaxRules(FSyntacticEnv se, expr) -> FSyntaxRules
- ExpandSyntaxRules(FSyntacticEnv se, FSyntaxRules sr, expr) -> expr
次は何をすれば良いかなぁ。
- FSyntacticEnvの定義を調べる?
- FSyntaxRules(syntax-rulesオブジェクト)の定義を調べる?
- ExpandSyntaxRulesで、FSyntacticEnvを使っている箇所を調べる?
まあこんなところかな。
FSyntaxRules
FSyntaxRulesはsynrules.cppに定義があった。
typedef struct
{
FRecord Record;
FObject Literals;
FObject Rules;
FObject SyntacticEnv;
} FSyntaxRules;
メンバ名もUpperCamelCaseなんだな...。そして例によって型がFObjectなので実際の(Shcemeレベルでの)型が何なのか分からないという。Ruleは、同ファイルにFSyntaxRuleという構造体があるからそれの配列かな?
typedef struct
{
FRecord Record;
FObject NumVariables;
FObject Variables; // A list of pattern variables.
FObject Pattern;
FObject Template;
} FSyntaxRule;
最初のメンバがいずれもFRecord Record;
だから、これは何らかの基盤側の仕組みで、レコード型のメンバではないのだろうな。
FSyntacticEnv
FSyntacticEnvの方はcompile.hppに定義があった。
typedef struct
{
FRecord Record;
FObject GlobalBindings;
FObject LocalBindings;
} FSyntacticEnv;
Recordはメンバではないとすると、GlobalBindingsとLocalBindingsの組らしい。これらの型はなんだろうか。
GlobalBindings, LocalBindingsの型
compile.cppにMakeSyntacticEnvという関数がある。そこを見ると、GlobalBindingsの型が分かりそうな箇所が。
if (EnvironmentP(obj))
{
se->GlobalBindings = obj;
se->LocalBindings = EmptyListObject;
}
EnvironmentPはfoment.hppで定義されている。
#define EnvironmentP(obj) RecordP(obj, R.EnvironmentRecordType)
つまりGlobalBindingsの型はFEnvironmentであるようだ。この構造体もfoment.hppにある。
typedef struct
{
FRecord Record;
FObject Name;
FObject HashMap;
FObject Interactive;
FObject Immutable;
} FEnvironment;
LocalBindingsもおそらくは同じ型だろう。
まとめ
今回は構造体FSyntaxRules, FSyntacticEnvの定義を見た。 次なにやるかは未定だけど、sytnax-rules固有の仕様よりは、hygenic macroに共通した部分のコードを先に調べたいという気持ちがある。