在Clojure中遍历,迭代,访问树木

时间:2013-02-13 13:34:10

标签: clojure

说我有一个如下定义的Clojure树

(def eval-logic
  '(:OR
     (:METHOD "methodName1" ["a1" "a2" "a3"])
     (:METHOD "methodName2" ["b1" "b2" "b3"])
     :AND
       (:METHOD "methodName3" [])
       (:METHOD "methodName4" ["d1"])
     ))

即。树表示一个布尔表达式,其中节点如:OR和:AND表示布尔运算符,树的叶子是方法调用。不评估树,仅遍历以生成在运行时执行实际评估的代码。 我应该如何遍历树,访问不同类型的节点,询问节点的父亲,孩子,兄弟姐妹等?是否有任何指针或库可以查看?

树不能太嵌套,因此尾递归不是问题。随意提出一些可能更适合遍历的其他数据结构。

我对深度优先遍历特别感兴趣,因为这是代码必须生成以确保在使用之前定义函数的顺序。此外,树是给定的,不会改变所以我对添加或删除孩子等事情不感兴趣

1 个答案:

答案 0 :(得分:11)

要随时移动树木,请参阅clojure.zip。如需简单漫步,请参阅clojure.walktree-seq。在Tree visitors in Clojure上有一篇关于这个主题的IBM文章。