For the example given, I would say it depends on what you are trying to 
express. 

  The function f1 is a function that needs some internal data x to operate 
-x might be considered an implementation detail.
  The function f2 operates on well known data x -x might be considered 
configuration of f2 or a more general concept.

Use both appropriately to write more expressive code -constraining yourself 
to only one is like taking some of the colors off your palette.

In addition to the expression differences, there are two closely related 
issues that should be considered:

1. There is a difference in the evaluation semantics.  In the first 
example, the form bound to x is evaluated every time f1 is called.  In the 
second, the form is invoked just once (at compile time) and then closed 
over by f2.  That can have very real consequences in real world apps 
(performance, side-effects).  In simple cases where the form is effectively 
constant (as in your example), the compiler may optimize things such that 
the costs are equivalent -but I don't think that's a guarantee, especially 
on different runtimes (CLR, ClojureScript, etc).

2. There is a scope difference between the two.  The second approach allows 
you to close over x with multiple functions:

(let [x {:foo 1 :bar 2 :baz 3}] 
  (defn f3 [] 
    (keys x))
  (defn f4 [] 
    (vals x)))

-Chris

On Friday, March 22, 2013 2:59:43 PM UTC-4, jamieorc wrote:
>
> Curious which style is preferred in Clojure and why:
>
> (defn f1 [] 
>   (let [x {:foo 1 :bar 2 :baz 3}] 
>     (keys x))) 
>
> (let [x {:foo 1 :bar 2 :baz 3}] 
>   (defn f2 [] 
>     (keys x)))
>
> Cheers,
>
> Jamie
>

-- 
-- 
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