On Mon, Aug 19, 2013 at 6:41 PM, Anand Prakash <[email protected]> wrote:
> What is the major benefit of as->
>
> => (-> 4 (#(* % %)) (+ 12) )
>
> 28
>
> => (-> 4 (as-> y (* y y)) (+ 12))
>
> 28
Solving the contrived example doesn't really help answer the original
question of preference and tradeoffs. As to the benefits of as->, I'd
defer to the benefits of threading macros in general.
The actual production code I'd originally written had this shape,
though I suspect it won't make much sense without context.
(defn foo [xrel yrel]
(as-> (filter #(= "a val" (:a-key %)) xrel) x
(map :b-key x)
(set x)
(filter (comp x :b-key) yrel)
(set x)))
The above solution can be written in many ways, including
- a single let to build the filter predicate
(defn foo [xrel yrel]
(let [pred (->> xrel (filter (comp (partial = "a val") :a-key)) (map
:b-key) set)]
(set (filter (comp pred :b-key) yrel))))
and many other options as well
- using the -> macro, wrapping the map with a (->>) and extracting the
comp to (it's own) line above
- using clojure.set/project, select-keys, & clojure.set/select
- using group-by to create a map that you use as the filter pred
etc, etc.
The two that I found the most readable were
A. the above as solution, my first example
B. single let that builds the predicate set, my second example
I find that A, in my opinion, eliminates a let, but sacrifices a bit
of readability at a high level - i.e. it's hard to look at the parts
of the function and determine the sum of what you're trying to do.
Conversely, I find that B includes a let that's strictly introduced
for readability, and sacrifices low level readability - i.e. the parts
are not easy to digest, but once you've figured them out the sum of
what you're trying to do is very obvious.
I haven't decided which I prefer, though I tend to lean towards A,
considering it to be (as David described) an elimination of a
superfluous let.
Cheers, Jay
--
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
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 [email protected].
For more options, visit https://groups.google.com/groups/opt_out.