【问题标题】:Explain clojure map reducer implementation解释 clojure map reducer 实现
【发布时间】:2014-10-31 15:34:34
【问题描述】:

我正在尝试制作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] 被放在列表的开头。谁能解释一下?

【问题讨论】:

    标签: clojure reducers


    【解决方案1】:

    当作为函数调用时,向量、关键字、符号或哈希映射最终都会酌情调用get

    user> (get [:a :b :c] 1)
    :b
    user> ([:a :b :c] 1)
    :b
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-25
      • 2011-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多