【发布时间】:2011-12-18 19:59:42
【问题描述】:
我在 Clojure 中有一组值,我想构建类似于记录的结构。我正在尝试找出处理这些记录的最佳方式。
所以我有一个例如记录:
(defrecord Link [page url])
保存这些记录集合的最佳数据结构是什么,我可以递归地逐步遍历,同时不断更新集合?
以前我使用序列对单个值执行此操作,然后在我递归处理它们时在最后连接新链接。但现在我想保留有关每个链接的更多信息。
为清晰而编辑
我以前一直在使用地图,但是我想我一直在尝试将嵌套地图与 like 一起使用而让自己感到困惑
#{: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"}
而不是尝试使用嵌套地图。
但是,我之所以提到记录,是因为我正在努力使用第一种地图创建方法将两张地图合并在一起。对于用于递归映射的最佳结构,我仍然有些困惑。
最终更新
好的,经过一番折腾,我终于想出了下面这段代码,它返回由以下组成的向量序列:
["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 上,可以在我的个人资料中找到。
【问题讨论】:
-
我完全误解了你原来的问题,我会删除我的答案。
-
我认为您的回答是恰当的,它确实添加了有关使用我首先询问的各种数据结构的相关信息。
-
好的,我取消删除它。如果您发现它有用,其他人也可以。我希望你能得到关于所需数据结构的具体问题的答案,因为我现在想不出任何东西。
标签: clojure