【问题标题】:Clojure Sequence: not adding elements?Clojure 序列:不添加元素?
【发布时间】:2011-12-11 22:53:46
【问题描述】:

我正在尝试以递归方式爬取页面中的所有可用链接,如果它验证了有效链接,则从该页面中提取所有链接并将其添加到当前页面完成后要爬取的列表中.但是我认为在我的链接序列上使用 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)))))

我不太确定为什么它不将其他项目添加到列表中。谁能建议它为什么这样做?

【问题讨论】:

    标签: clojure


    【解决方案1】:

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

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

    一些额外的事情:

    • 以上将当前链接序列作为一个元素附加到get-link返回的任何内容;这可能不是您想要做的。
    • 这可能是学习如何使用和/或生成惰性序列的好时机。
    • 注意周期。

    【讨论】:

    • 好的,我将研究使用惰性序列和循环的详细信息。谢谢。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2023-04-02
      • 1970-01-01
      • 2013-05-13
      • 2018-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-04
      • 2012-01-11
      相关资源
      最近更新 更多