Hello,
I am relatively new to clojure and lispy languages in general. I
wrote a small program that manipulated thread vars using the binding
macro and I am seeing what seems to be strange behavior.
To illustrate, here is another small program that reproduces what I am
seeing (without all the distraction of the original). There is a
reason for the nested bindings in the original code where it seems a
bit contrived here. Regardless, if it is something I am doing wrong,
please let me know.
------------
(declare x y)
(def rnd1 (java.util.Random.))
(def rnd2 (java.util.Random.))
(defn throw-random-exception [c]
(let [value (.nextInt rnd1 100)]
(if (= value 50)
(throw (Exception. (str "Random Exception after count = "
c))))))
(defn change-value-of-thread-local-var []
(set! x (conj x (.nextInt rnd2 100))))
(defn test-binding []
(binding [x [0 1 2 3 4 5 6]]
(try
(loop [c 0]
(do
(change-value-of-thread-local-var)
(throw-random-exception c))
(recur (inc c)))
(catch Exception e (println (str x "\n" (.getMessage e)))))))
(defn test-nested-binding []
(binding [x [0 1 2 3 4 5 6]]
(try
(loop [c 0]
(binding [y [7 8 9]]
(do
(change-value-of-thread-local-var)
(throw-random-exception c))
(recur (inc c))))
(catch Exception e (println (str x "\n" (.getMessage e)))))))
------------
If I load this as a file at the REPL and then run "(test-binding)" the
value of x is unbound when the function returns. However if you run
"(test-nested-binding)" then the value of BOTH x and y have a bound
value when the function returns. Is this a bug? If so, where do I
report it? If not, what am I doing wrong? I have also moved the
binding of x inside the "try" and it has the same behavior.
thanks,
take care,
Mike
--
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