diff options
author | Rich Hickey <richhickey@gmail.com> | 2007-09-30 23:42:42 +0000 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2007-09-30 23:42:42 +0000 |
commit | a3bc99cd612e164a35e27ca6991075d55cd34d7e (patch) | |
tree | 4e10024759916caae6400c21b2f7452dd2d006e9 /src | |
parent | 4be49c5b2a179ab396e631dc533b14f7ea699c97 (diff) |
def and refer conflict checking, unintern
Diffstat (limited to 'src')
-rw-r--r-- | src/boot.clj | 13 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Compiler.java | 4 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Var.java | 2 |
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>(); |