Clojure递归和惰性序列

Clojure递归和惰性序列,clojure,Clojure,好的,我在这一点上有点卡住了,我真的可以用下面这部分代码做我想做的事情吗: (recur (conj (get-links (first links)) (rest links)))) get links返回一系列URL,这些URL被输入到初始进程链接调用中,然后应该递归 我输入的第一个链接起作用,但是第二个链接,我试图将一个序列连接到另一个序列,给了我以下错误 "Clojure.lang.LazySeq@xxxxxxx" 现在我想知道,这是否与生成未评估序列的“rest”(rest链接)的

好的,我在这一点上有点卡住了,我真的可以用下面这部分代码做我想做的事情吗:

(recur (conj (get-links (first links)) (rest links))))
get links返回一系列URL,这些URL被输入到初始进程链接调用中,然后应该递归

我输入的第一个链接起作用,但是第二个链接,我试图将一个序列连接到另一个序列,给了我以下错误

"Clojure.lang.LazySeq@xxxxxxx"
现在我想知道,这是否与生成未评估序列的“rest”(rest链接)的指令的引用相关联

(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 (conj (get-links (first links)) (rest links))))))))

如果我的方法完全错误,请告诉我。

conj
向收藏中添加项目。在两个集合上使用它将创建嵌套结构。您可能想要
concat
这两个序列

举例说明:

user> (conj [1 2 3] [4 5 6])
[1 2 3 [4 5 6]]
user> (concat [1 2 3] [4 5 6])
(1 2 3 4 5 6)
关于“Clojure.lang”。LazySeq@xxxxxxx“事情:

问题出在这段代码中:

(println (str (first links) " is working"))
在这里,您使用字符串连接函数
str
(第一个链接)
(在本例中不是字符串)和
“正在工作”
(一个字符串)粘合在一起。
str
如何处理非字符串参数?它对其调用
.toString
方法。
.toString
对Clojure数据有什么作用?并不总是你想要的东西

解决方案是使用
pr
函数系列
pr
以Clojure读取器可以识别的方式将Clojure数据写入流。如何重写上述截取内容的两个示例:

(do (pr (first links))
    (println " is working"))

;; Sligtly less efficient since a string must be created
(println (pr-str (first links)) "is working")

请注意,如果您为
println
提供多个参数,它将打印所有中间有空格的项目。

是的!另一个我不知道的功能!必须切换我的(获取链接(第一个链接))和(其余链接),但这似乎已经成功了。谢谢关于代码的一些提示。您不应该写(not(empty?…)),因为执行empty?是(不是(序号…)。所以你的基本写作(不是(不是(seq…)。只是写(seq…)是常见的模式,我认为你不必做(println(str…)),在大多数情况下你可以只做(println…)。而不是(如果不是…)使用(如果不是)。最上面的if没有“else”部分,在这种情况下使用when函数。第一个“do”函数也可以扔掉(特别是在使用“when”时,“when”makro总是添加一个“do”。我希望这会有所帮助。感谢您的提示,查看它是有意义的:)