遍歷語法樹的兩種方式: prewalk 和 postwalk

在編輯抽象語法樹(AST) 的時候, 咱們常常須要遍歷整個結構, elixir 標準庫中提供了兩種遍歷方式. 數據結構

舉個例子, 有這樣一個 AST:post

quote do
  add(1, 2)
end

quote 後的數據結構是這樣:spa

{:add, [], [1, 2]}

用圖像表示的話, 大概就是這樣, 有很明顯的層級關係:code

image.png

Prewalk

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]}]}
相關文章
相關標籤/搜索