关于elixir:遍历语法树的两种方式-prewalk-和-postwalk

6次阅读

共计 455 个字符,预计需要花费 2 分钟才能阅读完成。

在编辑形象语法树 (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]}]}
正文完
 0