2012-04-03 22 views
1

我寫了一個簡單的功能Clojure中可以解析XML:Clojure的易復發的怪異行爲

(defn filter-tags [xml & selectors] 
    (if (and (seq selectors) (seq xml)) 
    (recur   
     (->>  
     xml 
     (filter #(= (first selectors) (:tag %))) 
     (map :content) 
     flatten) 
     (rest selectors)) 
    xml)) 

(defn search-twitter [query] 
    (-> 
    (clojure.xml/parse (str "http://search.twitter.com/search.atom?q=" query)) 
    :content 
    (filter-tags :entry :title))) 

(first (search-twitter "something"))) 

它運作良好,具有易復發......但它是奇怪,當我嘗試做了「平原」遞歸,明確地調用過濾器標籤,它不起作用... 有人可以解釋這一點嗎?

+0

定義「不工作」 - 沒有輸出或堆棧跟蹤崩潰? – sw1nn 2012-04-03 08:48:37

+0

它返回零,因爲我記得(我使用Clojure 1.2) – Zsolt 2012-04-03 08:53:01

回答

2

您將需要使用apply(因爲參數selectors使函數可變參數)來調用使用普通的遞歸功能,如下圖所示:

(defn filter-tags [xml & selectors] 
    (if (and (seq selectors) (seq xml)) 
    (apply filter-tags   
     (->>  
     xml 
     (filter #(= (first selectors) (:tag %))) 
     (map :content) 
     flatten) 
     (rest selectors)) 
    xml)) 

或使其非可變參數那麼你的正常的遞歸調用將工作

+0

謝謝!我會試試這個。 – Zsolt 2012-04-03 10:29:06