2012-04-03 64 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