说我有一个如下定义的Clojure树
(def eval-logic
'(:OR
(:METHOD "methodName1" ["a1" "a2" "a3"])
(:METHOD "methodName2" ["b1" "b2" "b3"])
:AND
(:METHOD "methodName3" [])
(:METHOD "methodName4" ["d1"])
))
即。树表示一个布尔表达式,其中节点如:OR和:AND表示布尔运算符,树的叶子是方法调用。不评估树,仅遍历以生成在运行时执行实际评估的代码。 我应该如何遍历树,访问不同类型的节点,询问节点的父亲,孩子,兄弟姐妹等?是否有任何指针或库可以查看?
树不能太嵌套,因此尾递归不是问题。随意提出一些可能更适合遍历的其他数据结构。
我对深度优先遍历特别感兴趣,因为这是代码必须生成以确保在使用之前定义函数的顺序。此外,树是给定的,不会改变所以我对添加或删除孩子等事情不感兴趣
答案 0 :(得分:11)
要随时移动树木,请参阅clojure.zip。如需简单漫步,请参阅clojure.walk和tree-seq。在Tree visitors in Clojure上有一篇关于这个主题的IBM文章。