Clojure 如何遍历/漫游任意嵌入式结构

Clojure 如何遍历/漫游任意嵌入式结构,clojure,Clojure,我需要一种机制来遍历任意嵌套的数据结构。然后在每个节点上应用fn,然后检查fn是否在每个点返回true 使用平面结构很容易做到这一点- (walk (complement string?) #(every? true? %) [ 1 2 3 4]) 但是,walk不能与嵌套的walk一起工作- (walk (complement string?) #(every? true? %) [ 1 2 3 [ "a" ]]) 仅使用“展平”也不起作用,因为我将有一个映射作为表单之一,并且我希望fn也

我需要一种机制来遍历任意嵌套的数据结构。然后在每个节点上应用fn,然后检查fn是否在每个点返回true

使用平面结构很容易做到这一点-

(walk (complement string?) #(every? true? %) [ 1 2 3 4])
但是,walk不能与嵌套的walk一起工作-

(walk (complement string?) #(every? true? %) [ 1 2 3 [ "a" ]])
仅使用“展平”也不起作用,因为我将有一个映射作为表单之一,并且我希望fn也应用于映射中的每个值。这就是我将拥有的结构-

[ ["2012" [{:a 2} {:b 3}]] ["2013" [{:a 2} {:b 3}]] ]

我可以很容易地编写一个fn来只遍历上述内容,并将fn应用于每个val。但是有没有一种方法可以编写一个通用的遍历机制?

树序列可能就是您想要的

(every? (complement string?)
        (remove coll?
                (tree-seq coll? #(if (map? %)
                                   (vals %)
                                   %)
                          [["2012" [{:a 2} {:b 3}]] ["2013" [{:a 2} {:b 3}]]])))
;; false

(every? (complement string?)
        (remove coll?
                (tree-seq coll? #(if (map? %)
                                   (vals %)
                                   %)
                          [[2012 [{:a 2} {:b 3}]] [2013 [{:a 2} {:b 3}]]])))
;; true

查看
prewalk
postwark