这个clojure表达是做什么的(取自O'Reilly的书)

时间:2014-01-02 18:04:29

标签: clojure maps

我是Clojure Programming的新手。已经玩了一个星期了。我读了“Clojure Programming”这本书,经过一遍又一遍的阅读,尝试在REPL中剖析这个函数,但不知道这个函数究竟是如何工作的:

(defn reduce-by [key-fn f init coll]
  (reduce (fn [summaries x]
        (let [k (key-fn x)]
          (assoc summaries k (f (summaries k init) x))))
      {} coll))

我仍然无法理解assoc部分:

(assoc summaries k (f (summaries k init) x))))

特别是在(summaries k init)。它看起来不像函数,因为summaries被定义为地图。

该功能旨在按如下方式使用

(def orders
    [{:product "Clock", :customer "Wile Coyote", :qty 6, :total 300}
     {:product "Dynamite", :customer "Wile Coyote", :qty 20, :total 5000}
     {:product "Shotgun", :customer "Elmer Fudd", :qty 2, :total 800}
     {:product "Shells", :customer "Elmer Fudd", :qty 4, :total 100}
     {:product "Hole", :customer "Wile Coyote", :qty 1, :total 1000} 
     {:product "Anvil", :customer "Elmer Fudd", :qty 2, :total 300}
     {:product "Anvil", :customer "Wile Coyote", :qty 6, :total 900}])

(reduce-by :customer #(+ %1 (:total %2)) 0 orders)

它将产生如下所示的序列

;= {"Elmer Fudd" 1200, "Wile Coyote" 7200}

我很感激任何可以向我解释的人。

由于

1 个答案:

答案 0 :(得分:0)

好吧,看起来我想通了。

由于地图也是功能,如果地图(summaries k init)不包含密钥initsummaries将返回k的值。

愚蠢的我撇去并忘了。