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”。我希望这会有所帮助。感谢您的提示,查看它是有意义的:)