z5h*_*z5h 1 search traversal clojure data-structures
我希望能够做到这样的事情:
(search data
list?
(fn [x] (and (list? x) (= 4 (first x))))
(fn [x] (and (set? x) (contains x 3))))
Run Code Online (Sandbox Code Playgroud)
并以递归方式搜索嵌套数据结构data:
4.在重新发明轮子之前,有没有一种标准的方法呢?
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)))))
Run Code Online (Sandbox Code Playgroud)
clojure.zip末尾的这两个例子似乎清楚地表明你不需要知道数据结构是什么样的.循环的使用还表明,在遍历数据结构时,您可以轻松地仅累积您感兴趣的值.