summaryrefslogtreecommitdiff
path: root/src/org
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2006-05-23 18:12:54 +0000
committerRich Hickey <richhickey@gmail.com>2006-05-23 18:12:54 +0000
commit8800e169cf12df893fdd89c8e93edb36f8e5388e (patch)
tree0b7c32db9b7e4e2d3e7951a5b066220ac9d5ba22 /src/org
parent7b16ded965dfa76689d0235d4f1cf999a3f1c8a5 (diff)
derived Keyword from Symbol, IFn
Diffstat (limited to 'src/org')
-rw-r--r--src/org/clojure/runtime/AFn.java21
-rw-r--r--src/org/clojure/runtime/AMap.java4
-rw-r--r--src/org/clojure/runtime/Accessor.java8
-rw-r--r--src/org/clojure/runtime/Keyword.java61
-rw-r--r--src/org/clojure/runtime/Symbol.java8
5 files changed, 59 insertions, 43 deletions
diff --git a/src/org/clojure/runtime/AFn.java b/src/org/clojure/runtime/AFn.java
index a4ace498..c483a466 100644
--- a/src/org/clojure/runtime/AFn.java
+++ b/src/org/clojure/runtime/AFn.java
@@ -51,38 +51,41 @@ public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3,
return throwArity();
}
-public Object applyTo(ThreadLocalData tld, Cons arglist) throws Exception
+public Object applyTo(ThreadLocalData tld, Cons arglist) throws Exception {
+ return applyToHelper(this, tld, arglist);
+}
+static public Object applyToHelper(IFn ifn,ThreadLocalData tld, Cons arglist) throws Exception
{
switch(RT.boundedLength(arglist, 5))
{
case 0:
- return invoke(tld);
+ return ifn.invoke(tld);
case 1:
- return invoke(tld, arglist.first);
+ return ifn.invoke(tld, arglist.first);
case 2:
- return invoke(tld, arglist.first
+ return ifn.invoke(tld, arglist.first
, (arglist = arglist.rest).first
);
case 3:
- return invoke(tld, arglist.first
+ return ifn.invoke(tld, arglist.first
, (arglist = arglist.rest).first
, (arglist = arglist.rest).first
);
case 4:
- return invoke(tld, arglist.first
+ return ifn.invoke(tld, arglist.first
, (arglist = arglist.rest).first
, (arglist = arglist.rest).first
, (arglist = arglist.rest).first
);
case 5:
- return invoke(tld, arglist.first
+ return ifn.invoke(tld, arglist.first
, (arglist = arglist.rest).first
, (arglist = arglist.rest).first
, (arglist = arglist.rest).first
, (arglist = arglist.rest).first
);
default:
- return invoke(tld, arglist.first
+ return ifn.invoke(tld, arglist.first
, (arglist = arglist.rest).first
, (arglist = arglist.rest).first
, (arglist = arglist.rest).first
@@ -91,7 +94,7 @@ public Object applyTo(ThreadLocalData tld, Cons arglist) throws Exception
}
}
-protected Object throwArity()
+public static Object throwArity()
{
throw new IllegalArgumentException("Wrong number of args passed");
}
diff --git a/src/org/clojure/runtime/AMap.java b/src/org/clojure/runtime/AMap.java
index 5f8965c3..132d9ed8 100644
--- a/src/org/clojure/runtime/AMap.java
+++ b/src/org/clojure/runtime/AMap.java
@@ -19,7 +19,7 @@ public class AMap{
IdentityHashMap attrs;
public static final int INITIAL_SIZE = 7;
-public Object put(Indexer key, Object val)
+public Object put(Keyword key, Object val)
{
if(attrs == null)
attrs = new IdentityHashMap(INITIAL_SIZE);
@@ -27,7 +27,7 @@ public Object put(Indexer key, Object val)
return val;
}
-public Object get(Indexer key)
+public Object get(Keyword key)
{
if(attrs == null)
return null;
diff --git a/src/org/clojure/runtime/Accessor.java b/src/org/clojure/runtime/Accessor.java
index ca4a44d1..1471db18 100644
--- a/src/org/clojure/runtime/Accessor.java
+++ b/src/org/clojure/runtime/Accessor.java
@@ -40,10 +40,7 @@ public String toString()
*/
public Object invoke(ThreadLocalData tld, Object obj) throws Exception
{
- if(obj instanceof AMap)
- return ((AMap)obj).get(this);
- else if (obj == null)
- return null;
+
return Reflector.invokeInstanceMember(name,obj);
}
@@ -58,8 +55,7 @@ public Object invoke(ThreadLocalData tld, Object obj) throws Exception
*/
public Object invoke(ThreadLocalData tld, Object obj, Object val) throws Exception
{
- if(obj instanceof AMap)
- return ((AMap)obj).put(this,val);
+
return Reflector.invokeInstanceMember(name,obj,val);
}
diff --git a/src/org/clojure/runtime/Keyword.java b/src/org/clojure/runtime/Keyword.java
index 7fa09415..ed1d4191 100644
--- a/src/org/clojure/runtime/Keyword.java
+++ b/src/org/clojure/runtime/Keyword.java
@@ -12,40 +12,25 @@
package org.clojure.runtime;
-import java.util.HashMap;
-public class Keyword extends Indexer{
+public class Keyword extends Symbol implements IFn{
-final public static HashMap table = new HashMap();
-
-public final String name;
-
-public static Keyword intern(String name)
- {
- synchronized(table)
- {
- Keyword sym = (Keyword) table.get(name);
- if(sym == null)
- table.put(name, sym = new Keyword(name));
- return sym;
- }
- }
/**
- * Used by Namespace.intern()
+ * Used by intern()
*
* @param name
*/
Keyword(String name)
{
- this.name = name;
+ super(name);
}
-public String toString()
- {
- return ":" + name;
- }
+
+public Object invoke(ThreadLocalData tld) throws Exception {
+ return AFn.throwArity();
+}
/**
* Indexer implements IFn for attr access
@@ -56,11 +41,11 @@ public String toString()
* @throws Exception
*/
public Object invoke(ThreadLocalData tld, Object obj) throws Exception
- {
+ {
if (obj == null)
return null;
- return ((AMap)obj).get(this);
- }
+ return ((AMap)obj).get(this);
+ }
/**
* Indexer implements IFn for attr access
@@ -75,4 +60,30 @@ public Object invoke(ThreadLocalData tld, Object obj, Object val) throws Excepti
{
return ((AMap)obj).put(this,val);
}
+
+public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3) throws Exception
+ {
+ return AFn.throwArity();
+ }
+
+public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4) throws Exception
+ {
+ return AFn.throwArity();
+ }
+
+public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5)
+ throws Exception
+ {
+ return AFn.throwArity();
+ }
+
+public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Cons args)
+ throws Exception
+ {
+ return AFn.throwArity();
+ }
+
+public Object applyTo(ThreadLocalData tld, Cons arglist) throws Exception {
+ return AFn.applyToHelper(this, tld, arglist);
+}
}
diff --git a/src/org/clojure/runtime/Symbol.java b/src/org/clojure/runtime/Symbol.java
index 8cb79e18..dee1f7fe 100644
--- a/src/org/clojure/runtime/Symbol.java
+++ b/src/org/clojure/runtime/Symbol.java
@@ -36,7 +36,13 @@ public static Symbol intern(String name)
{
Symbol sym = (Symbol) table.get(name);
if(sym == null)
- table.put(name, sym = new Symbol(name));
+ {
+ if(name.charAt(0) == ':')
+ sym = new Keyword(name);
+ else
+ sym = new Symbol(name);
+ table.put(name, sym);
+ }
return sym;
}
}