Looking at the clojure docs, it doesn't appear to be defined whether
binding is a parallel (all vars are computed based on the initial
state) or sequential (vars are computed using the new values for vars
used in the same binding vector). A quick test shows that it appears
to be parallel:

(binding [a 1 b a] [a b]) => [1 nil]

Reviewing the implementation in clojure.contrib makes it seem that is
indeed true. It looks like all of the new values for the binding forms
are computed before the pairs are added to a hash that is sent to
pushThreadBindings.

Whether this is the desired behavior is another question entirely.

In any case, the fact that it is not documented seems like a bug,
especially since this behavior is different from let (as you point
out).

Tom

On Jul 11, 9:01 pm, bgray <[email protected]> wrote:
> Is this behavior expected from binding?
>
> user=> (def a nil)
> #'user/a
> user=> (def b nil)
> #'user/b
> user=> (binding [a 1 b (+ a 1)] a)
> java.lang.NullPointerException (NO_SOURCE_FILE:0)
> user=> (binding [a 1 b (+ a 1)] b)
> java.lang.NullPointerException (NO_SOURCE_FILE:0)
> user=> (let [a 1 b (+ a 1)] a)
> 1
> user=> (let [a 1 b (+ a 1)] b)
> 2
>
> Thanks,
> Brandon
--~--~---------~--~----~------------~-------~--~----~
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