1

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

(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 中找到的项目列表。

在我重新发明轮子之前,有没有标准的方法来做到这一点?

4

1 回答 1

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

于 2009-12-08T19:02:54.327 回答