トップ «前の日記(2016-08-09) 最新 次の日記(2016-10-20)» 編集

Route 477



2016-08-13

[scheme] Fomentを読む(5)

前回からだいぶ間が空いた。ちょっと別にやりたいことができたので、実を言うとこっちは休載しようと思っていたのだけど、月一ペースで更新するというのもありかもしれない。一回分の更新にはそれほど時間がかからないし、考えたことは全て文字に落としているから思い出すのもそれほど難しくないし。

前回はExpandSyntaxRulesの他にCompileSyntaxRulesという関数がエクスポートされていることを発見したのだった。

なのでsynrules.cppのたくさんの関数は、もしかしたら2種類に分類できるかもしれない。今回はそのあたりを見ていく。

関数一覧

一覧を再掲する。引数のうち、型名が省略されているものはFObject。

static FObject LiteralFind(se, list, obj)
static FObject CopyLiterals(se, obj, ellip)
static FObject PatternVariableFind(se, list, var)
static FObject CompilePatternVariables(se, form, lits, pat, ellip, pvars, int_t rd)
static void AssignVariableIndexes(pvars, int_t idx)
static int_t CountPatternsAfterRepeat(pat)
static FObject RepeatPatternVariables(se, pvars, pat, rvars)
static FObject CompilePattern(se, lits, pvars, ellip, pat)
static int_t ListFind(list, obj)
static int_t AddVarToTemplateRepeat(var, trs)
static FObject CompileTemplate(se, form, pvars, ellip, tpl, trs, int_t qea)
static FObject CompileRule(se, form, lits, rule, ellip)
FObject CompileSyntaxRules(se, obj)

static void InitRepeatVariables(vars, vals[], rvals[])
static void GatherRepeatVariables(vars, vals[], rvals[])
static int_t MatchPattern(se, cpat, vals[], expr)
static int_t CheckRepeatVariables(vars, vals[], expr)
static void SetRepeatVariables(vars, vals[], rvals[])
static FObject ExpandTemplateRepeat(tse, use, ctpl, int_t nv, vals[], int_t rc, ret, expr)
static FObject ExpandTemplate(tse, use, ctpl, int_t nv, vals[], expr)
FObject ExpandSyntaxRules(se, sr, expr)

CompileSyntaxRulesとExpandSyntaxRulesだけがこのファイル外にエクスポートされているのだった。それ以外はprivate的な補助関数というわけだが、もしかしてこれ、ファイルの前半と後半で綺麗に分けてありますか?

試しに、InitRepeatVariables以下の関数がどこから呼ばれているかを確認してみる。やはり、ファイル後半にあるのはすべてExpandSyntaxRulesの方の補助関数だった。いやあ、こういうのを綺麗なソースっていうんですよね(嬉)

コールグラフ

作成したコールグラフは以下。各補助関数がどの関数から呼ばれているかを調べて、それを木にしたもの。

- ExpandSyntaxRules
 - MatchPattern
   - InitRepeatVariables
   - GatherRepeatVariables
 - ExpandTemplate
   - CheckRepeatVariables
   - SetRepeatVariables
   - ExpandTemplateRepeat
     - ExpandTemplate(相互再帰)

CompileSyntaxRulesの方もやってみよう。

- CompileSyntaxRules
  - CopyLiterals
    - LiteralFind
  - CompileRule
    - CompilePatternVariables
      - PatternVariableFind, LiteralFind
    - AssignVariableIndexes
    - CompilePattern
      - PatternVariableFind, LiteralFind
      - CountPatternsAfterRepeat
      - RepeatPatternVariables
        - PatternVariableFind
    - CompileTemplate
      - PatternVariableFind
      - AddVarToTemplateRepeat
        - ListFind

こっちのほうが少しでかそう。

というところで今日はここまで。