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 <javascript:>>: 
> > 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";)) 
> > 
> > (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";)) 
> (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.


Reply via email to