抽象語法樹(AST),又稱為 quoted expression,是一種把程式碼表示成資料的方法。
AST 裡的每個節點都是一個包含 3 個元素的元組。
# AST representation of:
# 2 + 3
{:+, [], [2, 3]}
第一個元素是原子,代表要執行的運算。第二個元素是關鍵字清單,也就是中繼資料。第三個元素是引數清單,裡面包含其他節點。整數、原子、字串等字面值在 AST 裡會直接以自己表示,而不是包成 3 個元素的元組。
把 Elixir 程式碼轉成 AST,以及把 AST 轉回程式碼,都是標準函式庫的一部分。你可以在Code模組(例如把含有程式碼的字串轉成 AST)和Macro模組(例如走訪 AST 或把它轉成字串)裡找到處理 AST 的函式。
請注意,標準函式庫裡的所有函式都用「quoted」這個名稱來表示 AST(也就是 quoted expression 的簡稱)。
把程式碼轉成 AST 的特殊形式叫做 quote。它接受一個程式區塊,並回傳它的 AST。
quote do
2 + 3 - 1
end
# => {:-, [], [
# {:+, [], [2, 3]},
# 1
# ]}
能把程式碼表示成 AST 是 Elixir 超編程的核心。_巨集_是一種用 Elixir 程式碼產生 Elixir 程式碼的方式,運作原理是回傳 AST 作為輸出。
AST 的另一個使用情境是靜態程式碼分析,例如 Exercism 自己的工具 Analyzer,你或許早就認識它,就是那個會在你的解答上留下評論的小機器人。