Google日本語入力の「キャンセル後IMEを無効化」が効かなくて困っていたのだが、Terminal.appをやめてiTerm2にしたら効くようになった。

前回からの続き。前回はレコード型がstructと対応していることを確認したのだった。

なんとなくデータ構造が把握できたので、次はシーケンス、つまり「何がどの順で実行されるか」の調査に入る。

まずは、syntax-rulesが呼ばれた時に最初に実行される関数を見つけたいが、synrules.cppの冒頭も末尾もどうやら違いそうだ。名前的には、下から二番目のExpandSyntaxRulesがそれっぽい感じがする。

ExpandSyntaxRules

使われている場所をgit grepで確認する。

src/compile.hpp:FObject ExpandSyntaxRules(FObject se, FObject sr, FObject expr); src/library.cpp: return(CompileEvalExpr(ExpandSyntaxRules(MakeSyntacticEnv(env), op, Rest(obj)), env, src/synpass.cpp: return(SPassExpression(enc, se, ExpandSyntaxRules(se, val, Rest(expr)))); src/synpass.cpp:// return(SPassExpression(enc, se, ExpandSyntaxRules(MakeSyntacticEnv(se), val, Rest(expr)))); src/synpass.cpp: return(SPassBodyExpression(se, ExpandSyntaxRules(se, val, Rest(expr)))); src/synpass.cpp:// return(SPassBodyExpression(se, ExpandSyntaxRules(MakeSyntacticEnv(se), val, src/synrules.cpp:FObject ExpandSyntaxRules(FObject se, FObject sr, FObject expr)

library.cppとsynpass.cppで使われているようだ。ふーむ。

SyntaxRulesをExpandしたあとのことについてはあまり興味がないのでここを追ってもしかたないかなと思いつつ、呼び出し元の関数名だけ控えておく。

library.cpp static FObject CompileEvalExpr(FObject obj, FObject env, FObject body)

synpass.cpp static FObject SPassExpression(FObject enc, FObject se, FObject expr) static FObject SPassBodyExpression(FObject se, FObject expr)



synrules.cpp

ファイル内のエントリポイントが分かったので、次はファイル内の概要を把握しよう。 関数宣言の一覧を作る。

static FObject MakeSyntaxRules(FObject lits, FObject rules, FObject se) static FObject MakePatternVariable(int_t rd, FObject var) static FObject MakePatternRepeat(int_t lc, FObject ellip, FObject vars, FObject pat, static FObject MakeTemplateRepeat(FObject ellip, int_t rc) static FObject MakeSyntaxRule(int_t nv, FObject vars, FObject pat, FObject tpl)

このへんまでは単なるデータのコンストラクタだろう。したがってこれ以降がsyntax-rulesの本体と思われる。

static FObject LiteralFind(FObject se, FObject list, FObject obj) static FObject CopyLiterals(FObject se, FObject obj, FObject ellip) static FObject PatternVariableFind(FObject se, FObject list, FObject var) static FObject CompilePatternVariables(FObject se, FObject form, FObject lits, FObject pat, FObject ellip, FObject pvars, int_t rd) static void AssignVariableIndexes(FObject pvars, int_t idx) static int_t CountPatternsAfterRepeat(FObject pat) static FObject RepeatPatternVariables(FObject se, FObject pvars, FObject pat, FObject rvars) static FObject CompilePattern(FObject se, FObject lits, FObject pvars, FObject ellip, FObject pat) static int_t ListFind(FObject list, FObject obj) static int_t AddVarToTemplateRepeat(FObject var, FObject trs) static FObject CompileTemplate(FObject se, FObject form, FObject pvars, FObject ellip, FObject tpl, FObject trs, int_t qea) static FObject CompileRule(FObject se, FObject form, FObject lits, FObject rule, FObject ellip) FObject CompileSyntaxRules(FObject se, FObject obj) static void InitRepeatVariables(FObject vars, FObject vals[], FObject rvals[]) static void GatherRepeatVariables(FObject vars, FObject vals[], FObject rvals[]) static int_t MatchPattern(FObject se, FObject cpat, FObject vals[], FObject expr) static int_t CheckRepeatVariables(FObject vars, FObject vals[], FObject expr) static void SetRepeatVariables(FObject vars, FObject vals[], FObject rvals[]) static FObject ExpandTemplateRepeat(FObject tse, FObject use, FObject ctpl, int_t nv, FObject vals[], int_t rc, FObject ret, FObject expr) static FObject ExpandTemplate(FObject tse, FObject use, FObject ctpl, int_t nv, FObject vals[], FObject expr) FObject ExpandSyntaxRules(FObject se, FObject sr, FObject expr)

長い！こんなに関数があったのか。でも幸い、めちゃめちゃ長い関数はなかったので、次回は関数同士の呼び出し関係を調べるところからやる(かもしれないし、気分次第で別のことをするかもしれない)。