Clojure序列:不添加元素?

时间:2011-12-11 22:53:46

标签: clojure

我正在尝试递归浏览页面中的所有可用链接,如果它验证了工作链接,请从该页面拉出所有链接并将其添加到列表中,以便在当前页面完成后进行爬网。但是我认为我在链接序列中使用Conj遇到了问题。

当我运行我的代码时,它似乎只是在我第一次调用该函数时执行的初始链接列表。

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

我不太清楚为什么它没有在列表中添加其他项目。任何人都可以建议为什么这样做?

2 个答案:

答案 0 :(得分:3)

Clojure的数据结构是不可改变的。您没有对从以下位置返回的数据结构做任何事情:

(conj (get-links (first links)) links)

其他一些事情:

  • 上面将当前的链接序列作为元素添加到get-link返回的内容中;这可能不是你想要做的。
  • 这可能是学习如何使用和/或生成延迟序列的好时机。
  • 注意周期。

答案 1 :(得分:2)

这看起来像是一个使用tree-seq的有趣机会:在网址上创建一个树,其中每个网址的“子”都是通过诋毁其文字并查找更多链接来确定的。然后除了Alex提到的循环问题之外,你可以像任何其他序列一样遍历链接序列。