在Clojure中遍历、迭代和访问树

在Clojure中遍历、迭代和访问树,clojure,Clojure,假设我有一棵Clojure树,定义如下 (def eval-logic '(:OR (:METHOD "methodName1" ["a1" "a2" "a3"]) (:METHOD "methodName2" ["b1" "b2" "b3"]) :AND (:METHOD "methodName3" []) (:METHOD "methodName4" ["d1"]) )) 也就是说,树表示一个布尔表达式,其中:或和:等

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

(def eval-logic
  '(:OR
     (:METHOD "methodName1" ["a1" "a2" "a3"])
     (:METHOD "methodName2" ["b1" "b2" "b3"])
     :AND
       (:METHOD "methodName3" [])
       (:METHOD "methodName4" ["d1"])
     ))
也就是说,树表示一个布尔表达式,其中:或和:等节点表示布尔运算符,树的叶子是方法调用。树不会被计算,只会被遍历以生成在运行时执行实际计算的代码。 我应该如何遍历树,访问不同类型的节点,询问节点的父亲、孩子、兄弟姐妹等。?是否有任何指针或库可供查看

树的嵌套不能太深,因此不需要考虑尾部递归。请随意提出一些可能更易于遍历的其他数据结构


我对深度优先遍历特别感兴趣,因为这是代码生成的顺序,以确保在使用函数之前定义它们。此外,树是给定的,不会更改,因此我对添加或删除子对象之类的事情不感兴趣,因为我可以随意在树上移动。有关简单步行,请参见和。在上有一篇关于这个主题的IBM文章