summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2007-09-30 23:42:42 +0000
committerRich Hickey <richhickey@gmail.com>2007-09-30 23:42:42 +0000
commita3bc99cd612e164a35e27ca6991075d55cd34d7e (patch)
tree4e10024759916caae6400c21b2f7452dd2d006e9
parent4be49c5b2a179ab396e631dc533b14f7ea699c97 (diff)
def and refer conflict checking, unintern
-rw-r--r--src/boot.clj13
-rw-r--r--src/jvm/clojure/lang/Compiler.java4
-rw-r--r--src/jvm/clojure/lang/Var.java2
3 files changed, 13 insertions, 6 deletions
diff --git a/src/boot.clj b/src/boot.clj
index 034389c2..cdb58644 100644
--- a/src/boot.clj
+++ b/src/boot.clj
@@ -504,9 +504,13 @@
(when (. clojure.lang.Var (find (sym (str *current-namespace*) (str name))))
(throw (new Exception (strcat "Name conflict: " name " already exists in this namespace"))))
(let [varsym (sym (str ns) (str name))
- var (. clojure.lang.Var (find varsym))]
+ var (. clojure.lang.Var (find varsym))
+ rvar ((. refers (get)) name)]
(if var
- (. refers (bindRoot (assoc (. refers (get)) name var)))
+ (if rvar
+ (when (not (eql? rvar var))
+ (throw (new Exception (strcat "Name conflict: " name " already exists in this refer map as: " (. rvar sym)))))
+ (. refers (bindRoot (assoc (. refers (get)) name var))))
(throw (new Exception (strcat "Can't find Var: " varsym)))))))))
(defn unrefer [& names]
@@ -514,6 +518,9 @@
(dolist name names
(. refers (bindRoot (dissoc (. refers (get)) name))))))
+(defn unintern [varsym]
+ (. clojure.lang.Var (unintern varsym)))
+
(def *exports*
'(clojure
load-file eql-ref?
@@ -537,6 +544,6 @@
map mapcat filter take take-while drop drop-while
cycle split-at split-with repeat replicate iterate
dolist
- eval import unimport refer unrefer in-namespace
+ eval import unimport refer unrefer in-namespace unintern
))
diff --git a/src/jvm/clojure/lang/Compiler.java b/src/jvm/clojure/lang/Compiler.java
index e7dc8419..7dbf4191 100644
--- a/src/jvm/clojure/lang/Compiler.java
+++ b/src/jvm/clojure/lang/Compiler.java
@@ -265,8 +265,8 @@ static class DefExpr implements Expr{
if(!v.sym.ns.equals(currentNS().name))
{
if(sym.ns == null)
- throw new Exception("Name conflict, can't def " + sym + " because " + currentNS().name +
- " namespace refers to:" + v.sym);
+ throw new Exception("Name conflict, can't def " + sym + " because namespace: " + currentNS().name +
+ " refers to:" + v.sym);
else
throw new Exception("Can't create defs outside of current ns");
}
diff --git a/src/jvm/clojure/lang/Var.java b/src/jvm/clojure/lang/Var.java
index f411b660..1a0952fb 100644
--- a/src/jvm/clojure/lang/Var.java
+++ b/src/jvm/clojure/lang/Var.java
@@ -59,7 +59,7 @@ static InheritableThreadLocal<Frame> dvals = new InheritableThreadLocal<Frame>()
Object root;
transient final AtomicInteger count;
-final Symbol sym;
+final public Symbol sym;
boolean macroFlag = false;
static ConcurrentHashMap<Symbol, Var> table = new ConcurrentHashMap<Symbol, Var>();