2009/5/18 Konrad Hinsen <konrad.hin...@laposte.net>:
>
> On May 18, 2009, at 11:58, Adrian Cuthbertson wrote:
>
>> I know I keep plugging this - sorry - but it just keeps surfacing
>> as a solution;
>>
>> (lcm 4 6)
>> 12
>> (binding [clojure.contrib.math/gcd (fn [a b] 1)] (lcm 4 6))
>> 24
>
> Such a use of binding will lead to bad surprises as soon as you use
> it with lazy sequences:

And there's also the problem that bindings do not "traverse" threads,
even if one thread is just used as a "technical thread" (e.g. a thread
from a pool of threads).

So if e.g. some code works without parallelism, it may well not work
anymore if one piece on the call chain is delivered with a new version
that uses parallel computing (e.g. starts using pmap instead of map).



>
> (map #(lcm % 6) (range 6))
> -> (0 6 6 6 12 30)
>
> (binding [clojure.contrib.math/gcd (fn [a b] 1)]
>   (map #(lcm % 6) (range 6)))
> -> (0 6 6 6 12 30)
>
> You have to use doall to get the result you expect:
>
> (binding [clojure.contrib.math/gcd (fn [a b] 1)]
>   (doall (map #(lcm % 6) (range 6))))
> -> (0 6 12 18 24 30)
>
> The reason is that the temporary binding remains active only while
> map creates the lazy sequence that it returns, but it is no longer
> active when the actual elements of the lazy sequence are evaluated.
>
> More details and examples in my blog post:
>   http://onclojure.com/2009/05/06/simulating-dynamic-scoping/
>
> Konrad.
>
>
> >
>

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

Reply via email to