Recursion Clojure复发';她奇怪的行为
我用Clojure编写了一个简单的函数,可以解析XML:Recursion Clojure复发';她奇怪的行为,recursion,clojure,tail-recursion,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)
(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")))
它与recur配合得很好…但奇怪的是,当我尝试执行“普通”递归时,显式调用过滤器标记,它不起作用。。。
有人能解释一下吗?您需要使用
apply
(因为参数选择器使函数可变)使用普通递归调用函数,如下所示:
(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))
或者将其设为非变量,那么您的正常递归调用将起作用定义“不起作用”-没有输出或stacktrace崩溃?我记得很清楚,它返回nil(我使用Clojure 1.2)