That works.  Thanks!

take care,

Mike

On Sep 14, 1:38 am, Meikel Brandmeyer <m...@kotka.de> wrote:
> Hi,
>
> I can reproduce it with 1.2 and 1.3.0-master-20100911.130147-5. And I
> think I know, what the problem is: You must not recur out of a
> binding. The binding implicitely contains a try with cleanup code in
> the finally clause. It seems that recur bypasses the finally and
> executes again the binding. This pushes another frame of the bindings
> onto the stack, but the old frame is not popped. When the exception is
> thrown, the finally part gets executed and one frame is popped, but
> the additional frames remain. The stack of bindings is now out of
> sync. Hence your result. Throwing the exception in the first iteration
> will leave the bindings stack intact.
>
> user=> (binding [x [1 2 3]] (loop [c 0] (binding [y [4 5 6]] (throw
> (Exception. "BOOOM")))))
> Exception BOOOM  user/eval13 (NO_SOURCE_FILE:9)
> user=> x
> IllegalStateException Var user/x is unbound.  clojure.lang.Var.deref
> (Var.java:142)
> user=> y
> IllegalStateException Var user/y is unbound.  clojure.lang.Var.deref
> (Var.java:142)
>
> Please find the following code, which works as expected:
>
> (defn test-fixed-nested-binding
>   []
>   (binding  [x [0 1 2 3 4 5 6]]
>     (try
>       (binding [y [7 8 9]]
>         (loop [c 0]
>           (change-value-of-thread-local-var)
>           (throw-random-exception c)
>           (recur (inc c))))
>       (catch Exception e (println (str x "\n" (.getMessage e)))))))
>
> Since recur is local, I think "don't do it" is a valid short- to mid-
> term fix.
>
> Sincerely
> Meikel

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

Reply via email to