Объясните реализацию редуктора карт clojure

Я пытаюсь разобраться в core.reducers library, и я столкнулся со следующей строкой кода о r/map:

(defmacro ^:private defcurried
  "Builds another arity of the fn that returns a fn awaiting the last
  param"
  [name doc meta args & body]
  (do-curried name doc meta args body))

(defn- do-rfn [f1 k fkv] 
  `(fn
     ([] (~f1))
     ~(clojure.walk/postwalk
       #(if (sequential? %)
          ((if (vector? %) vec identity)
           (core/remove #{k} %))
          %)
       fkv)
     ~fkv))

(defmacro ^:private rfn
  "Builds 3-arity reducing fn given names of wrapped fn and key, and k/v impl."
  [[f1 k] fkv]
  (do-rfn f1 k fkv))

(defcurried map
  "Applies f to every value in the reduction of coll. Foldable."
  {:added "1.5"}
  [f coll]
  (folder coll
          (fn [f1]
            (rfn [f1 k]
                 ;; the following is k/v implementation but
                 ([ret k v] ;; why a `vector` is placed in the beginning of a list???
                  (f1 ret (f k v)))))))

В реализации defcurried map rfn выглядит странно и необычно для меня, потому что я не понимаю, почему [ret k v] ставится в начало списка. Кто-нибудь может объяснить?


person babygau    schedule 07.09.2014    source источник


Ответы (1)


При вызове в качестве функции вектор, ключевое слово, символ или хэш-карта в конечном итоге вызовут get по мере необходимости.

user> (get [:a :b :c] 1)
:b
user> ([:a :b :c] 1)
:b
person noisesmith    schedule 07.09.2014