On Tue, Jul 14, 2009 at 3:04 PM, bgray<[email protected]> wrote:
>
> I'm not sure if this is a binding issue or not.
>
> user=> (def a 1)
> #'user/a
> user=> (binding [a 3] (filter #(= % a) '(1 2 3)))
> (1)
> user=>
>
> In this case, I was expecting a list with 3 in it.

filter is lazy, and your lazy seq is "leaking" out of the
binding dynamic scope.  You must be careful with 'binding'
in the presence of delayed evaluation and threads.  This
includes lazy-seqs, delays, futures, agents, and really
closures in general.

To get your expected result, simply force the seq to be
realized before you return it, such as with doall, or put it
into a non-lazy collection, such as with vec.

user=> (binding [a 3] (doall (filter #(= % a) '(1 2 3))))
(3)

--Chouser

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

Reply via email to