Clojure数据结构遍历/搜索

时间:2009-12-08 17:31:48

标签: search data-structures clojure traversal

我希望能够做到这样的事情:

(search data 
  list?
  (fn [x] (and (list? x) (= 4 (first x))))
  (fn [x] (and (set? x) (contains x 3))))

让它以递归方式搜索嵌套数据结构data

  1. 首先列出最浅的列表(例如,可能在一组集合中)。
  2. 然后在最浅层列表的列表中,第一个元素是4
  3. 然后在那些包含3的最浅集合的列表中。
  4. 最后返回在步骤3中找到的项目列表。
  5. 在重新发明轮子之前,有没有一种标准的方法呢?

1 个答案:

答案 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末尾的这两个例子似乎清楚地表明你不需要知道数据结构的样子。循环的使用还表明,在遍历数据结构时,您可以轻松地仅累积您感兴趣的值。