Clojure重现了奇怪的行为

时间:2012-04-03 08:37:51

标签: recursion clojure tail-recursion

我在Clojure中编写了一个可以解析XML的简单函数:

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

它适用于复现......但奇怪的是,当我尝试进行“普通”递归时,显式调用filter-tags,它不起作用...... 有人可以解释一下吗?

1 个答案:

答案 0 :(得分: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))

或者使其为非可变参数,然后您的正常递归调用将起作用