在编辑形象语法树(AST) 的时候, 咱们常常须要遍历整个构造, elixir 规范库中提供了两种遍历形式.
举个例子, 有这样一个 AST:
quote do add(1, 2)end
quote 后的数据结构是这样:
{:add, [], [1, 2]}
用图像示意的话, 大略就是这样, 有很显著的层级关系:
Prewalk
prewalk 就是以从外层到内层的程序, 进行遍历. 留神最初返回的元组里, 第二个参数才是咱们的 acc.
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 正相反, 是从外向外遍历.
iex(6)> Macro.postwalk(ast, [], fn...(6)> x, acc -> ...(6)> {x, acc ++ [x]} ...(6)> end ...(6)> ){{:add, [], [1, 2]}, [1, 2, {:add, [], [1, 2]}]}