yhara.jp

Recent Posts

Fomentを読む(7)

2016-11-08
Tech

http://yhara.jp/ReadingFoment

一月経ったので続きを。前回は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に共通した部分のコードを先に調べたいという気持ちがある。

More posts

Posts

(more...)

Articles

(more...)

Category

Ads

About

About the author