在編輯抽象語法樹(AST) 的時候, 咱們常常須要遍歷整個結構, elixir 標準庫中提供了兩種遍歷方式. 數據結構
舉個例子, 有這樣一個 AST:post
quote do add(1, 2) end
quote 後的數據結構是這樣:spa
{:add, [], [1, 2]}
用圖像表示的話, 大概就是這樣, 有很明顯的層級關係:code
prewalk 就是以從外層到內層的順序, 進行遍歷. 注意最後返回的元組裏, 第二個參數纔是咱們的 acc.it
iex(5)> Macro.prewalk(ast, [], fn ...(5)> x, acc -> ...(5)> {x, acc ++ [x]} ...(5)> end ...(5)> ) {{:add, [], [1, 2]}, [{:add, [], [1, 2]}, 1, 2]}
postwalk 正相反, 是從內向外遍歷.ast
iex(6)> Macro.postwalk(ast, [], fn ...(6)> x, acc -> ...(6)> {x, acc ++ [x]} ...(6)> end ...(6)> ) {{:add, [], [1, 2]}, [1, 2, {:add, [], [1, 2]}]}