diff options
author | Rich Hickey <richhickey@gmail.com> | 2007-07-02 14:57:01 +0000 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2007-07-02 14:57:01 +0000 |
commit | e4bbdb0c9af57495d16c8b4f97248c0137030da9 (patch) | |
tree | 598cd973f844f18b72c0beec1c300dc0fe24ee55 /src | |
parent | d5081fd98c12a3f933ca0d0b5389fb97018b9f38 (diff) |
interim checkin
Diffstat (limited to 'src')
-rw-r--r-- | src/jvm/clojure/lang/Keyword.java | 51 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Symbol.java | 38 | ||||
-rw-r--r-- | src/jvm/clojure/lang/TRef.java | 17 |
3 files changed, 53 insertions, 53 deletions
diff --git a/src/jvm/clojure/lang/Keyword.java b/src/jvm/clojure/lang/Keyword.java index 50c44b6f..c043b394 100644 --- a/src/jvm/clojure/lang/Keyword.java +++ b/src/jvm/clojure/lang/Keyword.java @@ -13,7 +13,7 @@ package clojure.lang; -public class Keyword extends Symbol implements IFn { +public class Keyword implements IFn { /** @@ -21,10 +21,39 @@ public class Keyword extends Symbol implements IFn { * * @param name */ -Keyword(String name) { - super(name); + +public final Symbol sym; +final int hash; + +public Keyword(Symbol sym){ + this.sym = sym; + this.hash = RT.hashCombine(":".hashCode(), sym.hashCode()); } +public Keyword(String name,String ns){ + this(new Symbol(name,ns)); +} + +public boolean equals(Object o){ + if(this == o) + return true; + if(o == null || !(o instanceof Keyword)) + return false; + + Keyword keyword = (Keyword) o; + + //identity compares ok, names are interned + return sym.equals(keyword.sym); +} + +public int hashCode(){ + return hash; +} + + +public String toString(){ + return ":" + sym; +} public Object invoke() throws Exception { return AFn.throwArity(); @@ -32,10 +61,9 @@ public Object invoke() throws Exception { /** * Indexer implements IFn for attr access - * This single arg version is the getter * - * @param obj - must be Obj - * @return the value of the attr or nil if not found + * @param obj - must be IPersistentMap + * @return the value at the key or nil if not found * @throws Exception */ public Object invoke(Object obj) throws Exception { @@ -44,17 +72,8 @@ public Object invoke(Object obj) throws Exception { return ((IPersistentMap) obj).get(this); } -/** - * Indexer implements IFn for attr access - * This two arg version is the setter - * - * @param obj - must be Obj - * @param val - * @return val - * @throws Exception - */ public Object invoke(Object obj, Object val) throws Exception { - return RT.assoc(this, val, obj); + return AFn.throwArity(); } public Object invoke(Object arg1, Object arg2, Object arg3) throws Exception { diff --git a/src/jvm/clojure/lang/Symbol.java b/src/jvm/clojure/lang/Symbol.java index b9c7ffe9..cae743c2 100644 --- a/src/jvm/clojure/lang/Symbol.java +++ b/src/jvm/clojure/lang/Symbol.java @@ -14,15 +14,22 @@ package clojure.lang; public class Symbol{ -//this must be an interned string! +//these must be interned strings! public final String name; +public final String ns; public String toString(){ + if(ns != null) + return ns + "/" + name; return name; } -Symbol(String name){ +public Symbol(String name,String ns){ this.name = name.intern(); + if(ns != null) + this.ns = ns.intern(); + else + this.ns = null; } public boolean equals(Object o){ @@ -33,33 +40,12 @@ public boolean equals(Object o){ Symbol symbol = (Symbol) o; - //identity compare ok, names are interned - return name == symbol.name; + //identity compares intended, names are interned + return name == symbol.name && ns == symbol.ns; } public int hashCode(){ - return name.hashCode(); -} - -//* -public static Symbol intern(String name){ - int dot = 0; - Symbol sym; - if(name.charAt(0) == ':') - sym = new Keyword(name); - else if((dot = name.indexOf('.')) != -1) - { - if(dot == 0) - sym = new InstanceMemberSymbol(name); - else if(name.lastIndexOf('.') == name.length() - 1) - sym = new ClassSymbol(name); - else - sym = new StaticMemberSymbol(name); - } - else - sym = new Symbol(name); - return sym; + return RT.hashCombine(name.hashCode(),RT.hash(ns)); } -//*/ } diff --git a/src/jvm/clojure/lang/TRef.java b/src/jvm/clojure/lang/TRef.java index b67a804e..a9649b38 100644 --- a/src/jvm/clojure/lang/TRef.java +++ b/src/jvm/clojure/lang/TRef.java @@ -49,15 +49,9 @@ public T get() throws Exception{ return getCurrentVal(); } -Binding getThreadBinding(){ +final Binding getThreadBinding(){ if(dvals != null) - { - Binding b; - if((b = (Binding) dvals.get()) != null) - { - return b; - } - } + return (Binding) dvals.get(); return null; } @@ -84,7 +78,7 @@ public T set(T val) throws Exception{ Binding b = getThreadBinding(); if(b != null) return (T) (b.val = val); - //allow out-of-transaction inits + //allow out-of-transaction inits? if(!isBound()) { tvals.set(new TVal(val, Transaction.ZERO_POINT, null)); @@ -105,8 +99,9 @@ public void touch() throws Exception{ } boolean isBound(){ - return (dvals != null && dvals.get() != null) - || tvals.get() != null; + return (dvals != null && dvals.get() != null ) + || + getCurrentTVal() != null; } TVal getCurrentTVal(){ |