9

假设我有一个 Clojure 树,定义如下

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

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

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

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

4

1 回答 1

10

要随意移动树木,请参阅clojure.zip。对于简单的步行,请参阅clojure.walktree-seq在 Clojure 的 Tree 访问者中有一篇关于该主题的 IBM 文章。

于 2013-02-13T13:46:07.233 回答