diff options
| author | Rich Hickey <richhickey@gmail.com> | 2006-05-23 18:12:54 +0000 |
|---|---|---|
| committer | Rich Hickey <richhickey@gmail.com> | 2006-05-23 18:12:54 +0000 |
| commit | 8800e169cf12df893fdd89c8e93edb36f8e5388e (patch) | |
| tree | 0b7c32db9b7e4e2d3e7951a5b066220ac9d5ba22 /src/org | |
| parent | 7b16ded965dfa76689d0235d4f1cf999a3f1c8a5 (diff) | |
derived Keyword from Symbol, IFn
Diffstat (limited to 'src/org')
| -rw-r--r-- | src/org/clojure/runtime/AFn.java | 21 | ||||
| -rw-r--r-- | src/org/clojure/runtime/AMap.java | 4 | ||||
| -rw-r--r-- | src/org/clojure/runtime/Accessor.java | 8 | ||||
| -rw-r--r-- | src/org/clojure/runtime/Keyword.java | 61 | ||||
| -rw-r--r-- | src/org/clojure/runtime/Symbol.java | 8 |
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; } } |
