Clojure数据结构遍历/搜索

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:

  1. 首先是最浅的列表(例如,可能在一组集合中).
  2. 然后在最浅层列表的列表中,第一个元素是谁4.
  3. 然后在那些包含3的最浅集合的列表中.
  4. 最后返回在步骤3中找到的项目列表.

在重新发明轮子之前,有没有一种标准的方法呢?

dno*_*len 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))))) 
Run Code Online (Sandbox Code Playgroud)

clojure.zip末尾的这两个例子似乎清楚地表明你不需要知道数据结构是什么样的.循环的使用还表明,在遍历数据结构时,您可以轻松地仅累积您感兴趣的值.