【问题标题】:Clojure recur's strange behaviorClojure 反复出现的奇怪行为
【发布时间】:2012-04-03 08:37:50
【问题描述】:

我在 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")))

它适用于递归......但很奇怪,当我尝试进行“普通”递归时,显式调用过滤器标签,它不起作用...... 有人可以解释一下吗?

【问题讨论】:

  • 定义“不起作用” - 没有输出或堆栈跟踪崩溃?
  • 它返回 nil,我记得很清楚(我使用 Clojure 1.2)

标签: recursion clojure tail-recursion


【解决方案1】:

您将需要使用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))

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

【讨论】:

    猜你喜欢
    • 2016-12-27
    • 1970-01-01
    • 2013-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-13
    • 2011-12-08
    相关资源
    最近更新 更多