summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/jvm/clojure/lang/Keyword.java51
-rw-r--r--src/jvm/clojure/lang/Symbol.java38
-rw-r--r--src/jvm/clojure/lang/TRef.java17
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(){