summaryrefslogtreecommitdiff
path: root/src/cli
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2006-05-23 21:01:35 +0000
committerRich Hickey <richhickey@gmail.com>2006-05-23 21:01:35 +0000
commit494fd9c97ce10cbe481e2b35eafa3c044ea093ac (patch)
tree145fb9c4abf556c1774807cd569ecaf26db145da /src/cli
parent8800e169cf12df893fdd89c8e93edb36f8e5388e (diff)
derived Accessor from Symbol
Diffstat (limited to 'src/cli')
-rw-r--r--src/cli/runtime/Accessor.cs15
-rw-r--r--src/cli/runtime/Namespace.cs8
-rw-r--r--src/cli/runtime/Symbol.cs5
3 files changed, 16 insertions, 12 deletions
diff --git a/src/cli/runtime/Accessor.cs b/src/cli/runtime/Accessor.cs
index cf341d95..2a26ce32 100644
--- a/src/cli/runtime/Accessor.cs
+++ b/src/cli/runtime/Accessor.cs
@@ -12,8 +12,17 @@ using System;
namespace org.clojure.runtime
{
-public class Accessor :Indexer
+public class Accessor :Symbol, IFn
{
- public String name; public Namespace ns; internal Accessor(String name, Namespace ns) { this.ns = ns; this.name = name; } public String toString() { if(ns == null) return "#:." + name; return ns.name + ":." + name; } /** * Indexer implements IFn for attr access * This single arg version is the getter * @param tld * @param obj - must be AMap * @return the value of the attr or nil if not found * @throws Exception */ override public Object invoke(ThreadLocalData tld, Object obj) //throws Exception {
- return Reflector.invokeInstanceMember(name, obj); } /** * Indexer implements IFn for attr access * This two arg version is the setter * @param tld * @param obj - must be AMap * @param val * @return val * @throws Exception */ override public Object invoke(ThreadLocalData tld, Object obj, Object val) //throws Exception { return Reflector.invokeInstanceMember(name,obj,val); } override public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3) //throws Exception { return Reflector.invokeInstanceMember(name,arg1,arg2,arg3); } override public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4) //throws Exception { return Reflector.invokeInstanceMember(name,arg1,arg2,arg3,arg4); } override public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5) //throws Exception { return Reflector.invokeInstanceMember(name,arg1,arg2,arg3,arg4,arg5); } override public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Cons args) //throws Exception { return Reflector.invokeInstanceMember(name,arg1,arg2,arg3,arg4,arg5,args); } }
+ internal Accessor(String name) :base(name) { }
+
+public Object invoke(ThreadLocalData tld) /*throws Exception*/ {
+ return AFn.throwArity();
+ } /** * Indexer implements IFn for attr access * This single arg version is the getter * @param tld * @param obj - must be AMap * @return the value of the attr or nil if not found * @throws Exception */ public Object invoke(ThreadLocalData tld, Object obj) //throws Exception {
+ return Reflector.invokeInstanceMember(name, obj); } /** * Indexer implements IFn for attr access * This two arg version is the setter * @param tld * @param obj - must be AMap * @param val * @return val * @throws Exception */ public Object invoke(ThreadLocalData tld, Object obj, Object val) //throws Exception { return Reflector.invokeInstanceMember(name,obj,val); } public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3) //throws Exception { return Reflector.invokeInstanceMember(name,arg1,arg2,arg3); } public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4) //throws Exception { return Reflector.invokeInstanceMember(name,arg1,arg2,arg3,arg4); } public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5) //throws Exception { return Reflector.invokeInstanceMember(name,arg1,arg2,arg3,arg4,arg5); } public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Cons args) //throws Exception { return Reflector.invokeInstanceMember(name,arg1,arg2,arg3,arg4,arg5,args); }
+
+public Object applyTo(ThreadLocalData tld, Cons arglist) /*throws Exception*/ {
+ return AFn.applyToHelper(this, tld, arglist);
+ }
+ }
}
diff --git a/src/cli/runtime/Namespace.cs b/src/cli/runtime/Namespace.cs
index 0e18d90f..3dd6eb9a 100644
--- a/src/cli/runtime/Namespace.cs
+++ b/src/cli/runtime/Namespace.cs
@@ -28,7 +28,6 @@ static public HybridDictionary table = new HybridDictionary();
* String->Symbol
*/
public HybridDictionary vars = new HybridDictionary();
-public HybridDictionary accessors = new HybridDictionary();
public String name;
@@ -59,13 +58,6 @@ static public Var internVar(String ns, String var)
return findOrCreate(ns).internVar(var);
}
-static public Accessor internAccessor(String ns, String name)
- {
- return findOrCreate(ns).internAccessor(name);
- }
-
public Var internVar(String name) { lock(vars) { Var var = (Var) vars[name]; if(var == null) vars.Add(name,var = new Var(name, this)); return var; } }
-
-public Accessor internAccessor(String name) { lock(accessors) { Accessor acc = (Accessor) accessors[name]; if(acc == null) accessors.Add(name, acc = new Accessor(name, this)); return acc; } }
}
}
diff --git a/src/cli/runtime/Symbol.cs b/src/cli/runtime/Symbol.cs
index 4f532d14..af7465f7 100644
--- a/src/cli/runtime/Symbol.cs
+++ b/src/cli/runtime/Symbol.cs
@@ -30,7 +30,10 @@ public String toString()
return name;
}
-public static Symbol intern(String name) { lock(table) { Symbol sym = (Symbol) table[name]; if(sym == null) { if(name[0] == ':') sym = new Keyword(name); else sym = new Symbol(name); table.Add(name, sym); } return sym; } }
+public static Symbol intern(String name) { lock(table) { Symbol sym = (Symbol) table[name]; if(sym == null) { if(name[0] == ':') sym = new Keyword(name);
+ else if (name[0] == '.')
+ sym = new Accessor(name);
+ else sym = new Symbol(name); table.Add(name, sym); } return sym; } }
/**
* Used by Namespace.intern()
* @param name