diff options
author | Stuart Halloway <stu@thinkrelevance.com> | 2010-06-29 23:03:05 -0400 |
---|---|---|
committer | Stuart Halloway <stu@thinkrelevance.com> | 2010-06-30 21:33:28 -0400 |
commit | daed9dfb86a34c362a614f29c259a35d781d6b1e (patch) | |
tree | 1b52485cb3da8965ed477202d9ed4741ac3d92bb | |
parent | 0f4b6495347dc7d9601cc0907d5d08dd861bb3aa (diff) |
#391 ok for namespaces to replace their own vars
Signed-off-by: Stuart Halloway <stu@thinkrelevance.com>
-rw-r--r-- | src/jvm/clojure/lang/Namespace.java | 9 | ||||
-rw-r--r-- | test/clojure/test_clojure/rt.clj | 10 |
2 files changed, 15 insertions, 4 deletions
diff --git a/src/jvm/clojure/lang/Namespace.java b/src/jvm/clojure/lang/Namespace.java index 4c557a9a..19369733 100644 --- a/src/jvm/clojure/lang/Namespace.java +++ b/src/jvm/clojure/lang/Namespace.java @@ -79,11 +79,14 @@ public Var intern(Symbol sym){ } private void warnOrFailOnReplace(Symbol sym, Object o, Object v){ - if (o instanceof Var) { - if (((Var)o).ns != RT.CLOJURE_NS) { + if (o instanceof Var) + { + Namespace ns = ((Var)o).ns; + if (ns == this) + return; + if (ns != RT.CLOJURE_NS) throw new IllegalStateException(sym + " already refers to: " + o + " in namespace: " + name); } - } RT.errPrintWriter().println("WARNING: " + sym + " already refers to: " + o + " in namespace: " + name + ", being replaced by: " + v); } diff --git a/test/clojure/test_clojure/rt.clj b/test/clojure/test_clojure/rt.clj index 5b7f2493..175bfd82 100644 --- a/test/clojure/test_clojure/rt.clj +++ b/test/clojure/test_clojure/rt.clj @@ -83,10 +83,18 @@ (deftest last-var-wins-for-core (testing "you can replace a core name, with warning" - (let [ns (temp-ns 'clojure.set) + (let [ns (temp-ns) replacement (gensym)] (with-err-string-writer (intern ns 'prefers replacement)) (is (= replacement @('prefers (ns-publics ns)))))) + (testing "you can replace a name you defined before" + (let [ns (temp-ns) + s (gensym) + v1 (intern ns 'foo s) + v2 (intern ns 'bar s)] + (with-err-string-writer (.refer ns 'flatten v1)) + (.refer ns 'flatten v2) + (is (= v2 (ns-resolve ns 'flatten))))) (testing "you cannot intern over an existing non-core name" (let [ns (temp-ns 'clojure.set) replacement (gensym)] |