Clojure使用记录

时间:2011-12-18 19:59:43

标签: clojure

我在Clojure中有一组值,我希望构造类似于record。我正在试图找出处理这些记录的最佳方法。

所以我有一个例如记录:

(defrecord Link [page url])

什么是最好的数据结构来保存这些记录的集合,我可以递归地逐步完成,同时不断更新集合?

以前我在使用序列的单个值上完成了这个,然后在递归处理它们时在最后连接新的链接。但现在我想了解有关每个链接的更多信息。

编辑清晰度

我以前一直在使用地图,但是我觉得我一直在试图使用类似

的嵌套地图而让自己感到困惑
#{:rootlink "http://www.google.co.uk" :links nestedmapoflinks} 
当我试图通过它来诅咒时,这让我感到困惑。

下面是我一直在使用的代码,下面是目前使用的一系列链接,但没有关于链接的其他信息。

(defn get-links
[url]
(map :href (map :attrs (html/select (fetch-url url) [:a])))))

(defn process-links
[links]
(if (not (empty? links))
(do
  (if (not (is-working (first links)))
(do
  (println (str (first links) " is not working"))
  (recur (rest links)))
(do
  (println (str (first links) " is working"))
  (recur (concat (rest links) (get-links (first links)))))))))

我想我必须使用

将每个项目添加到地图中
{:rootlink "http://www.google.co.uk" :link "http://someurlontherootlinkpage.com"} 

而不是尝试使用嵌套地图。

然而,我提到记录的原因,是因为我正在努力使用第一种地图创建方法将两个地图合并在一起。我仍然对用于递归地图的最佳结构感到困惑。

最终更新

好的,所以在经过多次争吵之后,我终于想出了下面这段代码,它返回了由以下内容组成的seq:

["root link address" "link"]
["http://www.google.co.uk" "http://www.google.co.uk/examplelink"]

代码:

(defn get-links
   [url]
   (map #(vector url %)(map :href (map :attrs (html/select (fetch-url url) [:a])))))

现在我的github上的代码可以在我的个人资料中找到。

1 个答案:

答案 0 :(得分:1)

我认为您在使用Tree类型结构或平面结构时感到困惑。 假设您有一个链接列表作为地图矢量:

[ {:root nil :link "A.COM"} {:root nil :link "B.COM"} ]

现在您映射并使用您获得的get-link方法:

[ [ {:root nil :link "A.COM"} {:root "A.COM" :link "Aa.COM"} {:root "A.COM" :link "Ab.COM"} ] [ {:root nil :link "B.COM"} {:root "B.COM" :link "Ba.COM"} {:root "B.COM" :link "Bb.COM"}] ]

现在,您可以在此结果上调用flatten以获取链接的平面列表,而不是矢量中的嵌套地图。

您可以递归重复此过程,直到退出条件满足。