Clojure recur странное поведение - PullRequest
1 голос
/ 03 апреля 2012

Я написал простую функцию в 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")))

Хорошо работает с recur ... но странно, когда я пытаюсь сделать "обычную" рекурсию, явно вызывая filter-tag, она не работает ... Может ли кто-нибудь объяснить это?

1 Ответ

2 голосов
/ 03 апреля 2012

Вам нужно будет использовать 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))

Или сделать ее не переменной, тогда вашнормальный рекурсивный вызов будет работать

...