2011-12-13 74 views
4

好吧,我被困在這一個了一下,其實我可以做什麼,我想用下面的代碼,這部分做的事:Clojure的遞歸和懶惰序列

(recur (conj (get-links (first links)) (rest links)))) 

得到鏈接返回一個輸入到初始process-links調用中的url序列,然後進行遞歸。

第一個鏈接我餵養的作品,但第二個鏈接,我試圖將一個序列連接到另一個給我以下錯誤。

"[email protected]" 

現在我想知道,這是在conj'ing參考指令生成未評估序列的「休息」(其餘的鏈接)?

(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)))))))) 

如果我對我的方法完全錯誤,請告訴我。

+3

關於你的代碼的一些提示。你不應該寫(不是空的?...)),因爲它是空的嗎?是(不是(seq ...))。所以你basiclly寫作(不(不(seq ...)))。只是寫(seq ...)是常見的模式,我不認爲你必須這麼做(println(str ....)),你可以在大多數情況下執行(println ...)。而不是(如果(不...))使用(如果沒有)。最頂層的if沒有'else'部分,在這種情況下使用when函數。第一個'do'函數也可以被扔掉(特別是當使用'when'時,'when'makro總是添加一個'do',我希望這會有所幫助 – nickik 2011-12-14 23:42:43

+0

感謝提示,有道理看它:) – Dale 2011-12-15 20:51:11

回答

7

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) 
1

關於 「[email protected]」 的事情:

的問題是在這個片段:

(println (str (first links) " is working")) 

在這裏,您使用的字符串連接功能str粘合在一起(first links),這不是一個字符串在這種情況下,和" is working",這是一個字符串。 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將打印在兩者之間的空間的所有項目。