AS

AST の Elixir

2個の演習

ASTについて

抽象構文木(AST)は、クォート式とも呼ばれ、コードをデータとして表現する方法です。

ASTの各ノードは、3要素のタプルです。

# AST representation of:
# 2 + 3
{:+, [], [2, 3]}

1つ目の要素はアトムで、演算を表します。2つ目の要素はキーワードリストで、メタデータです。3つ目の要素は引数のリストで、その中には他のノードが入ります。整数・アトム・文字列などのリテラル値は、ASTの中では3要素のタプルではなく、それ自身として表現されます。

コードをASTに変換する

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は、解答にコメントを残してくれる小さなボットとして、すでに見かけたことがあるかもしれません。

GitHubで編集 リンクは新しいウィンドウまたはタブで開きます

ASTを学習する

練習はロックされています

ASTを練習するには、あと1個の演習のロックを解除してください