summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/boot.clj6
-rw-r--r--src/jvm/clojure/lang/Compiler.java21
2 files changed, 19 insertions, 8 deletions
diff --git a/src/boot.clj b/src/boot.clj
index 5c65577c..034389c2 100644
--- a/src/boot.clj
+++ b/src/boot.clj
@@ -490,7 +490,7 @@
(. imps (bindRoot (assoc (. imps (get)) c (strcat pkg "." c))))))
(apply thisfn (rest import-lists))))
-(defn unimport [names]
+(defn unimport [& names]
(let [#^clojure.lang.Var imps *ns-imports*]
(dolist name names
(. imps (bindRoot (dissoc (. imps (get)) name))))))
@@ -501,13 +501,15 @@
ns (first rlist)
names (rest rlist)]
(dolist name names
+ (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))]
(if var
(. refers (bindRoot (assoc (. refers (get)) name var)))
(throw (new Exception (strcat "Can't find Var: " varsym)))))))))
-(defn unrefer [names]
+(defn unrefer [& names]
(let [#^clojure.lang.Var refers *ns-refers*]
(dolist name names
(. refers (bindRoot (dissoc (. refers (get)) name))))))
diff --git a/src/jvm/clojure/lang/Compiler.java b/src/jvm/clojure/lang/Compiler.java
index a04a4004..e7dc8419 100644
--- a/src/jvm/clojure/lang/Compiler.java
+++ b/src/jvm/clojure/lang/Compiler.java
@@ -197,13 +197,13 @@ static Symbol resolveSymbol(Symbol sym){
//already qualified or classname?
if(sym.ns != null || sym.name.indexOf('.') > 0)
return sym;
- IPersistentMap imports = (IPersistentMap) ((Var)RT.NS_IMPORTS.get()).get();
+ IPersistentMap imports = (IPersistentMap) ((Var) RT.NS_IMPORTS.get()).get();
//imported class?
String className = (String) imports.valAt(sym);
if(className != null)
return Symbol.intern(null, className);
//refers?
- IPersistentMap refers = (IPersistentMap) ((Var)RT.NS_REFERS.get()).get();
+ IPersistentMap refers = (IPersistentMap) ((Var) RT.NS_REFERS.get()).get();
Var var = (Var) refers.valAt(sym);
if(var != null)
return var.sym;
@@ -258,9 +258,18 @@ static class DefExpr implements Expr{
throw new Exception("Too few arguments to def");
else if(!(RT.second(form) instanceof Symbol))
throw new Exception("Second argument to def must be a Symbol");
- Var v = lookupVar((Symbol) RT.second(form), true);
+ Symbol sym = (Symbol) RT.second(form);
+ Var v = lookupVar(sym, true);
+ if(v == null)
+ throw new Exception("Can't refer to qualified var that doesn't exist");
if(!v.sym.ns.equals(currentNS().name))
- throw new Exception("Can't create defs outside of current ns");
+ {
+ if(sym.ns == null)
+ throw new Exception("Name conflict, can't def " + sym + " because " + currentNS().name +
+ " namespace refers to:" + v.sym);
+ else
+ throw new Exception("Can't create defs outside of current ns");
+ }
return new DefExpr(v, analyze(C.EXPRESSION, RT.third(form), v.sym.name), RT.count(form) == 3);
}
}
@@ -580,7 +589,7 @@ static abstract class HostExpr implements Expr{
className = sym.name;
else
{
- IPersistentMap imports = (IPersistentMap) ((Var)RT.NS_IMPORTS.get()).get();
+ IPersistentMap imports = (IPersistentMap) ((Var) RT.NS_IMPORTS.get()).get();
className = (String) imports.valAt(sym);
}
}
@@ -2574,7 +2583,7 @@ static Var lookupVar(Symbol sym, boolean internNew) throws Exception{
else
{
//is it an alias?
- IPersistentMap refers = (IPersistentMap) ((Var)RT.NS_REFERS.get()).get();
+ IPersistentMap refers = (IPersistentMap) ((Var) RT.NS_REFERS.get()).get();
var = (Var) refers.valAt(sym);
if(var == null && sym.ns == null)
var = Var.find(Symbol.intern(currentNS().name, sym.name));