There is a link "Download other versions with tooltips" near the top of the Clojure Cheat Sheet page (http://clojure.org/cheatsheet) that links to versions that are a bit more recent, and they include tooltips of the doc strings when you hover your cursor over the symbol.
The version at clojure.org/cheatsheet gets updated less frequently, simply because I have to ask someone else to do it who has the necessary permissions. I'll ask again now. Andy On Thu, Jul 11, 2013 at 6:50 AM, James Trunk <james.tr...@gmail.com> wrote: > Hello Laurent, > > Thank you so much for your detailed and helpful reply. > > > You could use the new as-> macro in clojure 1.5 > Is it possible to get as-> to work with thread-last? > > > depends :-) since your 2 fns are helper fns rather than > > generically-reusable fns, I would make them private to enforce that : > > (defn- ...) > Good point, and I'll definitely try to remember that in the future. > > > May I suggest alternative implementations ? > > <snip> > I really like both of your alternative solutions, and have learned several > new ideas from them. Thank you. > > By the way, I'm using the Clojure Cheat Sheet ( > http://clojure.org/cheatsheet) as my guide to the core functions, but it > doesn't seem to be up-to-date with all these fancy 1.5 functions that > you're using. Is there a new website that has superseded CCS? Do you know > why CCS isn't kept up-to-date? > > Regards, > James > > On Thursday, July 11, 2013 2:29:38 PM UTC+2, Laurent PETIT wrote: > >> Hello James, >> >> 2013/7/11 James Trunk <james...@gmail.com>: >> > Hi everyone, I'm new to Clojure and trying to learn my way around the >> > language. >> > >> > I've written a function that sums the frequencies of words starting >> with the >> > same letter, however I'm not fully satisfied with the result. I'm >> striving >> > for readability and idomaticity, but I fear that my rather limited >> grasp of >> > Clojure's core functions and lack of experience with functional >> programming >> > are letting me down on both counts. >> > >> > (def text (slurp >> > "http://www.ccel.org/ccel/**bible/kjv.txt<http://www.ccel.org/ccel/bible/kjv.txt>")) >> >> > >> > (defn sum-last-elements [coll] >> > (reduce + (map last coll))) >> > >> > (defn group-first-elements [coll] >> > (map first coll)) >> > >> > (->> text >> > (re-seq >> > #"(?:(?:\bm[a|e]n\b)|(?:\bwom[**a|e]n\b)|(?:\bchild\b)|(?:\**bchildren\b))") >> >> > frequencies >> > (group-by ffirst) >> > vals >> > (#(zipmap (map group-first-elements %) (map sum-last-elements >> %)))) >> > >> > Which on that file gives the result: >> > >> > {("woman" "women") 663, ("children" "child") 2274, ("men" "man") 5314} >> > >> > My questions: >> > >> > Is there a way to avoid using ?: everywhere in the regex? >> > (group-by ffirst) vals - is there a more readable/declarative/idiomatic >> way >> > to group by first letter? >> >> you could first (group-by first), then create the final map by calling >> (distinct) and count >> >> > Is there a trick to avoid the ugly looking anonymous function (which >> I'm >> > only using to reorder the thread-last argument)? >> >> You could use the new as-> macro in clojure 1.5 >> >> > Is it idiomatic to extract small functions to give them names (with an >> eye >> > to aiding readability) or would most Clojure programmers prefer these >> to be >> > anonymous and in-line? >> >> depends :-) since your 2 fns are helper fns rather than >> generically-reusable fns, I would make them private to enforce that : >> (defn- ...) >> >> > Is thread-last the right approach when dealing with nested >> data-structures >> > or is list comprehension, or some other approach preferred? >> >> The thread-last as you employed it is fine by me. >> >> May I suggest alternative implementations ? >> >> (def text (slurp >> "http://www.ccel.org/ccel/**bible/kjv.txt<http://www.ccel.org/ccel/bible/kjv.txt>")) >> >> (let [words (re-seq >> #"(?:(?:\bm[a|e]n\b)|(?:\bwom[**a|e]n\b)|(?:\bchild\b)|(?:\**bchildren\b))" >> >> text) >> words-per-initial (vals (group-by first words))] >> (zipmap >> (map distinct words-per-initial) >> (map count words-per-initial))) >> >> ;; => {("woman" "women") 663, ("children" "child") 2274, ("men" "man") >> 5314} >> >> >> >> or to avoid the intermediary creation of seqs of distincts and seqs of >> counts: >> >> (defn- reduce-initial [m initial initial-words] >> (assoc m (distinct initial-words) (count initial-words))) >> >> (let [words (re-seq >> #"(?:(?:\bm[a|e]n\b)|(?:\bwom[**a|e]n\b)|(?:\bchild\b)|(?:\**bchildren\b))" >> >> text) >> words-per-initial (group-by first words)] >> (reduce-kv reduce-initial {} words-per-initial)) >> >> ;; => {("woman" "women") 663, ("children" "child") 2274, ("men" "man") >> 5314} >> >> >> HTH, >> >> -- >> Laurent >> > -- > -- > 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 > Note that posts from new members are moderated - please be patient with > your first post. > 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 > --- > You received this message because you are subscribed to the Google Groups > "Clojure" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to clojure+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/groups/opt_out. > > > -- -- 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 Note that posts from new members are moderated - please be patient with your first post. 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 --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/groups/opt_out.