我希望能够做到这样的事情:
(search data
list?
(fn [x] (and (list? x) (= 4 (first x))))
(fn [x] (and (set? x) (contains x 3))))
让它以递归方式搜索嵌套数据结构data
:
4
。在重新发明轮子之前,有没有一种标准的方法呢?
答案 0 :(得分:6)
Clojure拥有穿越树木的标准方法。您应该查看clojure.zip并查看tree-seq。
(loop [loc dz]
(if (end? loc)
(root loc)
(recur (next (if (= '* (node loc))
(replace loc '/) loc)))))
(loop [loc dz]
(if (end? loc)
(root loc)
(recur (next (if (= '* (node loc))
(remove loc) loc)))))
clojure.zip末尾的这两个例子似乎清楚地表明你不需要知道数据结构的样子。循环的使用还表明,在遍历数据结构时,您可以轻松地仅累积您感兴趣的值。