Clojure的数据结构遍历/搜索

问题描述:

我希望能够做这样的事情:Clojure的数据结构遍历/搜索

(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

发现之前,我推倒重来,有没有这样做的标准方式吗?

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

+0

如果您已经知道您的数据结构,并且您应该查看更大结构中的哪个位置,则zip似乎很有用。 tree-seq有点适得其反,因为它掩盖了有问题的数据结构,并使它看起来像一个序列,所以你甚至不知道你是否在一个列表或一组集合中。 我给你一个+1,因为这些可能有助于构建我正在寻找的功能。 – z5h 2009-12-08 20:14:29

+0

例如,我可以设置tree-seq的children函数来注入标签,这些标签可以让我知道何时穿越子结构或穿越子结构。然后,消费搜索功能可以跟踪深度以及它在更大结构中的位置。 – z5h 2009-12-08 20:17:09