summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCosmin Stejerean <cosmin@offbytwo.com>2010-10-25 14:54:56 -0400
committerCosmin Stejerean <cosmin@offbytwo.com>2010-10-25 14:54:56 -0400
commitd9822fc889b77d5cabd29319765fd3a3260c61ac (patch)
tree052d632dd166fc68a94160bfd16216b5da70f604
parentd81122371248ee9042a2c6f0dc204208e018c986 (diff)
#465 make with-local-vars dynamic
-rw-r--r--src/clj/clojure/core.clj2
-rw-r--r--test/clojure/test_clojure/vars.clj12
2 files changed, 11 insertions, 3 deletions
diff --git a/src/clj/clojure/core.clj b/src/clj/clojure/core.clj
index 2e91937e..173a6c29 100644
--- a/src/clj/clojure/core.clj
+++ b/src/clj/clojure/core.clj
@@ -3747,7 +3747,7 @@
(vector? name-vals-vec) "a vector for its binding"
(even? (count name-vals-vec)) "an even number of forms in binding vector")
`(let [~@(interleave (take-nth 2 name-vals-vec)
- (repeat '(. clojure.lang.Var (create))))]
+ (repeat '(.. clojure.lang.Var create setDynamic)))]
(. clojure.lang.Var (pushThreadBindings (hash-map ~@name-vals-vec)))
(try
~@body
diff --git a/test/clojure/test_clojure/vars.clj b/test/clojure/test_clojure/vars.clj
index 5b25321c..c377236a 100644
--- a/test/clojure/test_clojure/vars.clj
+++ b/test/clojure/test_clojure/vars.clj
@@ -25,10 +25,18 @@
(eval `(binding [a 4] a)) 4 ; regression in Clojure SVN r1370
))
-; with-local-vars var-get var-set alter-var-root [var? (predicates.clj)]
+; var-get var-set alter-var-root [var? (predicates.clj)]
; with-in-str with-out-str
; with-open
-; with-precision
+
+(deftest test-with-local-vars
+ (let [factorial (fn [x]
+ (with-local-vars [acc 1, cnt x]
+ (while (> @cnt 0)
+ (var-set acc (* @acc @cnt))
+ (var-set cnt (dec @cnt)))
+ @acc))]
+ (is (= (factorial 5) 120))))
(deftest test-with-precision
(are [x y] (= x y)