我在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,它不起作用...... 有人可以解释一下吗?
答案 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))
或者使其为非可变参数,然后您的正常递归调用将起作用