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

Mar*_*tus 9 clojure

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

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

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

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

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

A. *_*ebb 11

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