Thanks Christophe, > Using a default return value, you can rewrite the (if-let...) as (conj > (amap key ()) item). A good point, getting clojure and clojure :)
(defn seq-to-multimap "takes a sequence s of possibly repeating elements and converts it to a map, where keys are obtained by applying key-fn to elements of s and values are sequences of all elements of s with a given key" [s key-fn] (reduce (fn [m el] (let [key (key-fn el)] (assoc m key (conj (m key []) el)))) {} s)) Boris On Apr 28, 5:31 pm, Christophe Grand <christo...@cgrand.net> wrote: > Hi Boris, > > Boris Mizhen a écrit : > > > > > I am starting to learn clojure. I would appreciate comments on the > > utility function below. > > Coding style, idiomatic Clojure, comment style, efficiency, naming > > conventions, indentations (used slime) ... anything I should > > improve :) > > > (defn seq-to-multimap [s key-fn] > > "takes a sequence s of possibly repeating elements > > and converts it to a map, where keys are obtained by applying key- > > fn > > to elements of s and values are sequence of all elements of s with > > the > > particular key" > > (reduce > > (fn [amap item] > > (let [key (key-fn item)] > > (assoc amap key > > (if-let [it (amap key)] > > (conj it item) > > (list item))))) > > {} s)) > > First, you misplaced the docstring: it comes before the args vector. > Using a default return value, you can rewrite the (if-let...) as (conj > (amap key ()) item). > > > user> (seq-to-multimap [1 :key :key 2 3 3 nil] #(identity %1)) > > {nil (nil), 3 (3 3), 2 (2), :key (:key :key), 1 (1)} > > Here you don't need to write #(identity %1), "identity" suffices. > > > Would it be better to have this function to create a list of lists > > using an equality op instead? > > I think it's a better choice to have it return a map because, to compute > the result, you need to efficiently index by key. > > -- > Professional:http://cgrand.net/(fr) > On Clojure:http://clj-me.blogspot.com/(en) --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en -~----------~----~----~----~------~----~------~--~---