抽象構文木(AST)は、クォート式とも呼ばれ、コードをデータとして表現する方法です。
ASTの各ノードは、3要素のタプルです。
# AST representation of:
# 2 + 3
{:+, [], [2, 3]}
1つ目の要素はアトムで、演算を表します。2つ目の要素はキーワードリストで、メタデータです。3つ目の要素は引数のリストで、その中には他のノードが入ります。整数・アトム・文字列などのリテラル値は、ASTの中では3要素のタプルではなく、それ自身として表現されます。
ElixirのコードをASTに変換したり、ASTをコードに戻したりする機能は、標準ライブラリに含まれています。ASTを扱う関数は、Codeモジュール(例: コードを含む文字列をASTに変換する)やMacroモジュール(例: ASTをたどったり文字列に変換したりする)にあります。
なお、標準ライブラリの関数はすべて、AST(_クォート式_の略)を指す名前として「quoted」を使っています。
コードをASTに変換するための特殊形式は、quoteです。ブロックをひとつ受け取り、そのASTを返します。
quote do
2 + 3 - 1
end
# => {:-, [], [
# {:+, [], [2, 3]},
# 1
# ]}
コードをASTとして表現できることは、Elixirのメタプログラミングの核心です。_マクロ_は、Elixirのコードを生み出すElixirのコードを書くための仕組みで、ASTを返すことで動作します。
ASTのもうひとつのユースケースは、静的コード解析です。たとえばExercism自身のツールであるAnalyzerは、解答にコメントを残してくれる小さなボットとして、すでに見かけたことがあるかもしれません。