diff options
author | Rich Hickey <richhickey@gmail.com> | 2006-06-09 12:42:56 +0000 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2006-06-09 12:42:56 +0000 |
commit | 4f72b81de88948e149af93dd96406e4f519e15c6 (patch) | |
tree | e4bdf36a13c6fbd2bee70eceada82aef7bf9b945 /src | |
parent | 3e18fcb60b00f869f74b112af5b5d90b9a9edba0 (diff) |
added ISeq, ISequential, modified Cons
Diffstat (limited to 'src')
35 files changed, 396 insertions, 300 deletions
diff --git a/src/cli/runtime/AFn.cs b/src/cli/runtime/AFn.cs index ceaec67d..0b7ef7ca 100644 --- a/src/cli/runtime/AFn.cs +++ b/src/cli/runtime/AFn.cs @@ -49,54 +49,54 @@ virtual public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Obje return throwArity(); } -virtual public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Cons args) +virtual public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, ISeq args) /*throws Exception*/ { return throwArity(); } -virtual public Object applyTo(ThreadLocalData tld, Cons arglist) /*throws Exception*/ +virtual public Object applyTo(ThreadLocalData tld, ISeq arglist) /*throws Exception*/ { return applyToHelper(this,tld,arglist); } -static public Object applyToHelper(IFn ifn,ThreadLocalData tld, Cons arglist) /*throws Exception*/ +static public Object applyToHelper(IFn ifn,ThreadLocalData tld, ISeq arglist) /*throws Exception*/ { switch(RT.boundedLength(arglist, 5)) { case 0:
return ifn.invoke(tld); case 1:
- return ifn.invoke(tld, arglist.first); + return ifn.invoke(tld, arglist.first()); case 2:
- return ifn.invoke(tld, arglist.first - , (arglist = arglist.rest).first + return ifn.invoke(tld, arglist.first() + , (arglist = arglist.rest()).first() ); case 3:
- return ifn.invoke(tld, arglist.first - , (arglist = arglist.rest).first - , (arglist = arglist.rest).first + return ifn.invoke(tld, arglist.first() + , (arglist = arglist.rest()).first() + , (arglist = arglist.rest()).first() ); case 4:
- return ifn.invoke(tld, arglist.first - , (arglist = arglist.rest).first - , (arglist = arglist.rest).first - , (arglist = arglist.rest).first + return ifn.invoke(tld, arglist.first() + , (arglist = arglist.rest()).first() + , (arglist = arglist.rest()).first() + , (arglist = arglist.rest()).first() ); case 5:
- return ifn.invoke(tld, arglist.first - , (arglist = arglist.rest).first - , (arglist = arglist.rest).first - , (arglist = arglist.rest).first - , (arglist = arglist.rest).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 ifn.invoke(tld, arglist.first - , (arglist = arglist.rest).first - , (arglist = arglist.rest).first - , (arglist = arglist.rest).first - , (arglist = arglist.rest).first - , arglist.rest); + return ifn.invoke(tld, arglist.first() + , (arglist = arglist.rest()).first() + , (arglist = arglist.rest()).first() + , (arglist = arglist.rest()).first() + , (arglist = arglist.rest()).first() + , arglist.rest()); } } diff --git a/src/cli/runtime/Accessor.cs b/src/cli/runtime/Accessor.cs index b63e5e7c..5c6948db 100644 --- a/src/cli/runtime/Accessor.cs +++ b/src/cli/runtime/Accessor.cs @@ -20,9 +20,9 @@ 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(memberName, 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(memberName,obj,val);
}
public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3) //throws Exception
{
return Reflector.invokeInstanceMember(memberName,arg1,arg2,arg3);
}
public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4) //throws Exception
{
return Reflector.invokeInstanceMember(memberName,arg1,arg2,arg3,arg4);
}
public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5)
//throws Exception
{
return Reflector.invokeInstanceMember(memberName,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(memberName,arg1,arg2,arg3,arg4,arg5,args);
}
+ return Reflector.invokeInstanceMember(memberName, 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(memberName,obj,val);
}
public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3) //throws Exception
{
return Reflector.invokeInstanceMember(memberName,arg1,arg2,arg3);
}
public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4) //throws Exception
{
return Reflector.invokeInstanceMember(memberName,arg1,arg2,arg3,arg4);
}
public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5)
//throws Exception
{
return Reflector.invokeInstanceMember(memberName,arg1,arg2,arg3,arg4,arg5);
}
public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, ISeq args)
//throws Exception
{
return Reflector.invokeInstanceMember(memberName,arg1,arg2,arg3,arg4,arg5,args);
}
-public Object applyTo(ThreadLocalData tld, Cons arglist) /*throws Exception*/ {
+public Object applyTo(ThreadLocalData tld, ISeq arglist) /*throws Exception*/ {
return AFn.applyToHelper(this, tld, arglist);
}
}
diff --git a/src/cli/runtime/Cons.cs b/src/cli/runtime/Cons.cs index e097aafb..9b1030fa 100644 --- a/src/cli/runtime/Cons.cs +++ b/src/cli/runtime/Cons.cs @@ -15,33 +15,42 @@ using System; namespace org.clojure.runtime
{ -public class Cons : Obj,Iter
+public class Cons : ISeq, ISequential
{ -public readonly Object first; -public readonly Cons rest; +private readonly Object _first; +private readonly ISeq _rest; -public Cons(Object first, Cons rest) +public Cons(Object first, ISeq rest) { - this.first = first; - this.rest = rest; + this._first = first; + this._rest = rest; }
-#region Iter Members
+#region ISeq Members
-public object get()
+public object first()
{
- return first;
+ return _first;
}
-public Iter iterate()
+public ISeq rest()
{
- return rest;
+ return _rest;
}
#endregion
- } +
+#region ISequential Members
+
+public ISeq seq()
+ {
+ return this;
+ }
+
+#endregion
+ } } diff --git a/src/cli/runtime/IFn.cs b/src/cli/runtime/IFn.cs index e96fd902..f2e86341 100644 --- a/src/cli/runtime/IFn.cs +++ b/src/cli/runtime/IFn.cs @@ -30,8 +30,8 @@ Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object /*throws Exception*/; Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, - Cons args) /*throws Exception*/; + ISeq args) /*throws Exception*/; -Object applyTo(ThreadLocalData tld, Cons arglist) /*throws Exception*/; +Object applyTo(ThreadLocalData tld, ISeq arglist) /*throws Exception*/; } } diff --git a/src/cli/runtime/ISeq.cs b/src/cli/runtime/ISeq.cs new file mode 100644 index 00000000..cd7d9134 --- /dev/null +++ b/src/cli/runtime/ISeq.cs @@ -0,0 +1,22 @@ +/**
+ * Copyright (c) Rich Hickey. All rights reserved.
+ * The use and distribution terms for this software are covered by the
+ * Common Public License 1.0 (http://opensource.org/licenses/cpl.php)
+ * which can be found in the file CPL.TXT at the root of this distribution.
+ * By using this software in any fashion, you are agreeing to be bound by
+ * the terms of this license.
+ * You must not remove this notice, or any other, from this software.
+ */
+
+using System;
+
+namespace org.clojure.runtime
+ {
+ public interface ISeq
+ {
+
+ Object first();
+
+ ISeq rest();
+ }
+ }
diff --git a/src/cli/runtime/ISequential.cs b/src/cli/runtime/ISequential.cs new file mode 100644 index 00000000..66d5023e --- /dev/null +++ b/src/cli/runtime/ISequential.cs @@ -0,0 +1,22 @@ +/**
+ * Copyright (c) Rich Hickey. All rights reserved.
+ * The use and distribution terms for this software are covered by the
+ * Common Public License 1.0 (http://opensource.org/licenses/cpl.php)
+ * which can be found in the file CPL.TXT at the root of this distribution.
+ * By using this software in any fashion, you are agreeing to be bound by
+ * the terms of this license.
+ * You must not remove this notice, or any other, from this software.
+ */
+using System;
+
+
+namespace org.clojure.runtime
+ {
+
+ public interface ISequential
+ {
+
+ ISeq seq();
+
+ }
+ }
diff --git a/src/cli/runtime/Keyword.cs b/src/cli/runtime/Keyword.cs index 903a8619..d4158540 100644 --- a/src/cli/runtime/Keyword.cs +++ b/src/cli/runtime/Keyword.cs @@ -42,13 +42,13 @@ public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, return AFn.throwArity();
}
-public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Cons args)
+public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, ISeq args)
/*throws Exception*/
{
return AFn.throwArity();
}
-public Object applyTo(ThreadLocalData tld, Cons arglist) /*throws Exception*/ {
+public Object applyTo(ThreadLocalData tld, ISeq arglist) /*throws Exception*/ {
return AFn.applyToHelper(this, tld, arglist);
} } diff --git a/src/cli/runtime/PersistentTree.cs b/src/cli/runtime/PersistentTree.cs index 61f18157..b4686264 100644 --- a/src/cli/runtime/PersistentTree.cs +++ b/src/cli/runtime/PersistentTree.cs @@ -729,7 +729,7 @@ public void Reset() #endregion
} - /*
+ //*
[STAThread] static public void Main(String[] args){ if(args.Length != 1)
@@ -778,7 +778,7 @@ static public void Main(String[] args){ Console.Error.WriteLine("count = " + set.count());
Console.WriteLine("Building Hashtable");
- Hashtable od = new Hashtable(1001);
+ Hashtable od = Hashtable.Synchronized(new Hashtable(1001));
start = DateTime.Now;
for (int i = 0; i < ints.Length; i++)
{
diff --git a/src/cli/runtime/RT.cs b/src/cli/runtime/RT.cs index ef60aa77..06455b47 100644 --- a/src/cli/runtime/RT.cs +++ b/src/cli/runtime/RT.cs @@ -52,18 +52,18 @@ public class RT return null;
}
- static public Object equal(Object arg1, Object arg2) {
- if(arg1 == null)
- return arg2 == null ? T : null;
- else if(arg2 == null)
- return null;
- return (eql(arg1,arg2) != null
- || (arg1 is Cons
- && arg2 is Cons
- && equal(((Cons)arg1).first,((Cons)arg2).first)!=null
- && equal(((Cons)arg1).rest,((Cons)arg2).rest)!=null))
- ?T:null;
- }
+ //static public Object equal(Object arg1, Object arg2) {
+ // if(arg1 == null)
+ // return arg2 == null ? T : null;
+ // else if(arg2 == null)
+ // return null;
+ // return (eql(arg1,arg2) != null
+ // || (arg1 is Cons
+ // && arg2 is Cons
+ // && equal(((Cons)arg1).first(),((Cons)arg2).first())!=null
+ // && equal(((Cons)arg1).rest(),((Cons)arg2).rest())!=null))
+ // ?T:null;
+ // }
static public Iter iter(Object coll)
{
@@ -163,7 +163,7 @@ public class RT {
return Convert.ToDouble(x);
}
-static public Cons cons(Object x, Cons y)
+static public Cons cons(Object x, ISeq y)
{
return new Cons(x, y);
}
@@ -198,27 +198,27 @@ static public Cons list(Object arg1, Object arg2, Object arg3, Object arg4, Obje return listStar(arg1, arg2, arg3, arg4, arg5, null);
}
-static public Cons listStar(Object arg1, Cons rest)
+static public Cons listStar(Object arg1, ISeq rest)
{
return cons(arg1, rest);
}
-static public Cons listStar(Object arg1, Object arg2, Cons rest)
+static public Cons listStar(Object arg1, Object arg2, ISeq rest)
{
return cons(arg1, cons(arg2, rest));
}
-static public Cons listStar(Object arg1, Object arg2, Object arg3, Cons rest)
+static public Cons listStar(Object arg1, Object arg2, Object arg3, ISeq rest)
{
return cons(arg1, cons(arg2, cons(arg3, rest)));
}
-static public Cons listStar(Object arg1, Object arg2, Object arg3, Object arg4, Cons rest)
+static public Cons listStar(Object arg1, Object arg2, Object arg3, Object arg4, ISeq rest)
{
return cons(arg1, cons(arg2, cons(arg3, cons(arg4, rest))));
}
-static public Cons listStar(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Cons rest)
+static public Cons listStar(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, ISeq rest)
{
return cons(arg1, cons(arg2, cons(arg3, cons(arg4, cons(arg5, rest)))));
}
@@ -231,20 +231,20 @@ static public Cons arrayToList(Object[] a) return ret;
}
-static public int length(Cons list)
+static public int length(ISeq list)
{
int i = 0;
- for(Cons c = list; c != null; c = c.rest)
+ for(ISeq c = list; c != null; c = c.rest())
{
i++;
}
return i;
}
-static public int boundedLength(Cons list, int limit)
+static public int boundedLength(ISeq list, int limit)
{
int i = 0;
- for(Cons c = list; c != null && i <= limit; c = c.rest)
+ for(ISeq c = list; c != null && i <= limit; c = c.rest())
{
i++;
}
@@ -347,7 +347,7 @@ static public Object setValues(ThreadLocalData tld, Object arg1, Object arg2, Ob }
static public Object setValues(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4,
- Object arg5, Cons args) /**/
+ Object arg5, ISeq args) /**/
{
if(tld == null)
tld = ThreadLocalData.get();
@@ -357,9 +357,9 @@ static public Object setValues(ThreadLocalData tld, Object arg1, Object arg2, Ob tld.mvArray[2] = arg3;
tld.mvArray[3] = arg4;
tld.mvArray[4] = arg5;
- for(int i = 5; args != null && i < ThreadLocalData.MULTIPLE_VALUES_LIMIT; i++, args = args.rest)
+ for(int i = 5; args != null && i < ThreadLocalData.MULTIPLE_VALUES_LIMIT; i++, args = args.rest())
{
- tld.mvArray[i] = args.first;
+ tld.mvArray[i] = args.first();
}
if(args != null)
throw new ArgumentException("Too many arguments to values (> ThreadLocalData.MULTIPLE_VALUES_LIMIT)");
diff --git a/src/cli/runtime/Reflector.cs b/src/cli/runtime/Reflector.cs index a2894285..a4088a31 100644 --- a/src/cli/runtime/Reflector.cs +++ b/src/cli/runtime/Reflector.cs @@ -127,7 +127,7 @@ public static Object invokeInstanceMember(String name, Object target) //throws E return prepRet(p.GetValue(target, new Object[]{boxArg(p.GetIndexParameters()[0].ParameterType,arg1)}));
p.SetValue(target,boxArg(p.PropertyType,arg1),null);
return arg1;
- }
return invokeInstanceMethod(name, target, new Object[]{arg1});
}
public static Object invokeInstanceMember(String name, Object target, Object arg1, Object arg2) //throws Exception
{
return invokeInstanceMethod(name, target, new Object[]{arg1, arg2});
}
public static Object invokeInstanceMember(String name, Object target, Object arg1, Object arg2, Object arg3)
//throws Exception
{
return invokeInstanceMethod(name, target, new Object[]{arg1, arg2, arg3});
}
public static Object invokeInstanceMember(String name, Object target, Object arg1, Object arg2, Object arg3,
Object arg4)
//throws Exception
{
return invokeInstanceMethod(name, target, new Object[]{arg1, arg2, arg3, arg4});
}
public static Object invokeInstanceMember(String name, Object target, Object arg1, Object arg2, Object arg3,
Object arg4,
Cons arglist)
//throws Exception
{
Object[] args = new Object[4 + RT.length(arglist)];
args[0] = arg1;
args[1] = arg2;
args[2] = arg3;
args[3] = arg4;
for(int i = 4; arglist != null; i++, arglist = arglist.rest)
args[i] = arglist.first;
return invokeInstanceMethod(name, target, args);
}
+ }
return invokeInstanceMethod(name, target, new Object[]{arg1});
}
public static Object invokeInstanceMember(String name, Object target, Object arg1, Object arg2) //throws Exception
{
return invokeInstanceMethod(name, target, new Object[]{arg1, arg2});
}
public static Object invokeInstanceMember(String name, Object target, Object arg1, Object arg2, Object arg3)
//throws Exception
{
return invokeInstanceMethod(name, target, new Object[]{arg1, arg2, arg3});
}
public static Object invokeInstanceMember(String name, Object target, Object arg1, Object arg2, Object arg3,
Object arg4)
//throws Exception
{
return invokeInstanceMethod(name, target, new Object[]{arg1, arg2, arg3, arg4});
}
public static Object invokeInstanceMember(String name, Object target, Object arg1, Object arg2, Object arg3,
Object arg4,
ISeq arglist)
//throws Exception
{
Object[] args = new Object[4 + RT.length(arglist)];
args[0] = arg1;
args[1] = arg2;
args[2] = arg3;
args[3] = arg4;
for(int i = 4; arglist != null; i++, arglist = arglist.rest())
args[i] = arglist.first();
return invokeInstanceMethod(name, target, args);
}
public static FieldInfo getField(Type t, string name,bool statics)
{
diff --git a/src/cli/runtime/RestFn0.cs b/src/cli/runtime/RestFn0.cs index 578a8c44..7ef2dc4f 100644 --- a/src/cli/runtime/RestFn0.cs +++ b/src/cli/runtime/RestFn0.cs @@ -18,9 +18,9 @@ namespace org.clojure.runtime public abstract class RestFn0 : AFn
{ -public abstract Object doInvoke(ThreadLocalData tld, Cons rest) /*throws Exception*/; +public abstract Object doInvoke(ThreadLocalData tld, ISeq rest) /*throws Exception*/; -override public Object applyTo(ThreadLocalData tld, Cons arglist) /*throws Exception*/ +override public Object applyTo(ThreadLocalData tld, ISeq arglist) /*throws Exception*/ { return doInvoke(tld, arglist); } @@ -56,7 +56,7 @@ override public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Obj return doInvoke(tld, RT.list(arg1, arg2, arg3, arg4, arg5)); } -override public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Cons args) +override public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, ISeq args) /*throws Exception*/ { return doInvoke(tld, RT.listStar(arg1, arg2, arg3, arg4, arg5, args)); diff --git a/src/cli/runtime/RestFn1.cs b/src/cli/runtime/RestFn1.cs index 822058f5..e61ecdd0 100644 --- a/src/cli/runtime/RestFn1.cs +++ b/src/cli/runtime/RestFn1.cs @@ -17,19 +17,19 @@ namespace org.clojure.runtime public abstract class RestFn1 : AFn{ -public abstract Object doInvoke(ThreadLocalData tld, Object arg1, Cons rest) /*throws Exception*/; +public abstract Object doInvoke(ThreadLocalData tld, Object arg1, ISeq rest) /*throws Exception*/; -override public Object applyTo(ThreadLocalData tld, Cons arglist) /*throws Exception*/ +override public Object applyTo(ThreadLocalData tld, ISeq arglist) /*throws Exception*/ {
switch (RT.boundedLength(arglist, 1))
{
case 0:
return invoke(tld);
case 1:
- return invoke(tld, arglist.first);
+ return invoke(tld, arglist.first());
default:
- return doInvoke(tld, arglist.first
- , arglist.rest);
+ return doInvoke(tld, arglist.first()
+ , arglist.rest());
}
} @@ -59,7 +59,7 @@ override public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Obj return doInvoke(tld, arg1, RT.list(arg2, arg3, arg4, arg5)); } -override public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Cons args) +override public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, ISeq args) /*throws Exception*/ { return doInvoke(tld, arg1, RT.listStar(arg2, arg3, arg4, arg5, args)); diff --git a/src/cli/runtime/RestFn2.cs b/src/cli/runtime/RestFn2.cs index bc528dfa..29d14761 100644 --- a/src/cli/runtime/RestFn2.cs +++ b/src/cli/runtime/RestFn2.cs @@ -17,24 +17,24 @@ namespace org.clojure.runtime public abstract class RestFn2 : AFn{
- public abstract Object doInvoke(ThreadLocalData tld, Object arg1, Object arg2, Cons rest) /*throws Exception*/; + public abstract Object doInvoke(ThreadLocalData tld, Object arg1, Object arg2, ISeq rest) /*throws Exception*/; -override public Object applyTo(ThreadLocalData tld, Cons arglist) /*throws Exception*/ +override public Object applyTo(ThreadLocalData tld, ISeq arglist) /*throws Exception*/ {
switch (RT.boundedLength(arglist, 2))
{
case 0:
return invoke(tld);
case 1:
- return invoke(tld, arglist.first);
+ return invoke(tld, arglist.first());
case 2:
- return invoke(tld, arglist.first
- , (arglist = arglist.rest).first
+ return invoke(tld, arglist.first()
+ , (arglist = arglist.rest()).first()
);
default:
- return doInvoke(tld, arglist.first
- , (arglist = arglist.rest).first
- , arglist.rest);
+ return doInvoke(tld, arglist.first()
+ , (arglist = arglist.rest()).first()
+ , arglist.rest());
} } @@ -60,7 +60,7 @@ override public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Obj return doInvoke(tld, arg1, arg2, RT.list(arg3, arg4, arg5)); } -override public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Cons args) +override public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, ISeq args) /*throws Exception*/ { return doInvoke(tld, arg1, arg2, RT.listStar(arg3, arg4, arg5, args)); diff --git a/src/cli/runtime/RestFn3.cs b/src/cli/runtime/RestFn3.cs index b236724c..3f7be0e2 100644 --- a/src/cli/runtime/RestFn3.cs +++ b/src/cli/runtime/RestFn3.cs @@ -17,30 +17,30 @@ namespace org.clojure.runtime public abstract class RestFn3 : AFn{
- public abstract Object doInvoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Cons rest) /*throws Exception*/; + public abstract Object doInvoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, ISeq rest) /*throws Exception*/; -override public Object applyTo(ThreadLocalData tld, Cons arglist) /*throws Exception*/ +override public Object applyTo(ThreadLocalData tld, ISeq arglist) /*throws Exception*/ {
switch (RT.boundedLength(arglist, 3))
{
case 0:
return invoke(tld);
case 1:
- return invoke(tld, arglist.first);
+ return invoke(tld, arglist.first());
case 2:
- return invoke(tld, arglist.first
- , (arglist = arglist.rest).first
+ return invoke(tld, arglist.first()
+ , (arglist = arglist.rest()).first()
);
case 3:
- return invoke(tld, arglist.first
- , (arglist = arglist.rest).first
- , (arglist = arglist.rest).first
+ return invoke(tld, arglist.first()
+ , (arglist = arglist.rest()).first()
+ , (arglist = arglist.rest()).first()
);
default:
- return doInvoke(tld, arglist.first
- , (arglist = arglist.rest).first
- , (arglist = arglist.rest).first
- , arglist.rest);
+ return doInvoke(tld, arglist.first()
+ , (arglist = arglist.rest()).first()
+ , (arglist = arglist.rest()).first()
+ , arglist.rest());
} } @@ -62,7 +62,7 @@ override public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Obj return doInvoke(tld, arg1, arg2, arg3, RT.list(arg4, arg5)); } -override public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Cons args) +override public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, ISeq args) /*throws Exception*/ { return doInvoke(tld, arg1, arg2, arg3, RT.listStar(arg4, arg5, args)); diff --git a/src/cli/runtime/RestFn4.cs b/src/cli/runtime/RestFn4.cs index 04dfb33f..29b0a21f 100644 --- a/src/cli/runtime/RestFn4.cs +++ b/src/cli/runtime/RestFn4.cs @@ -17,38 +17,38 @@ namespace org.clojure.runtime public abstract class RestFn4 : AFn{
- public abstract Object doInvoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4, Cons rest) + public abstract Object doInvoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4, ISeq rest) /*throws Exception*/; -override public Object applyTo(ThreadLocalData tld, Cons arglist) /*throws Exception*/ +override public Object applyTo(ThreadLocalData tld, ISeq arglist) /*throws Exception*/ {
switch (RT.boundedLength(arglist, 4))
{
case 0:
return invoke(tld);
case 1:
- return invoke(tld, arglist.first);
+ return invoke(tld, arglist.first());
case 2:
- return invoke(tld, arglist.first
- , (arglist = arglist.rest).first
+ return invoke(tld, arglist.first()
+ , (arglist = arglist.rest()).first()
);
case 3:
- return invoke(tld, arglist.first
- , (arglist = arglist.rest).first
- , (arglist = arglist.rest).first
+ return invoke(tld, arglist.first()
+ , (arglist = arglist.rest()).first()
+ , (arglist = arglist.rest()).first()
);
case 4:
- return invoke(tld, arglist.first
- , (arglist = arglist.rest).first
- , (arglist = arglist.rest).first
- , (arglist = arglist.rest).first
+ return invoke(tld, arglist.first()
+ , (arglist = arglist.rest()).first()
+ , (arglist = arglist.rest()).first()
+ , (arglist = arglist.rest()).first()
);
default:
- return doInvoke(tld, arglist.first
- , (arglist = arglist.rest).first
- , (arglist = arglist.rest).first
- , (arglist = arglist.rest).first
- , arglist.rest);
+ return doInvoke(tld, arglist.first()
+ , (arglist = arglist.rest()).first()
+ , (arglist = arglist.rest()).first()
+ , (arglist = arglist.rest()).first()
+ , arglist.rest());
} } @@ -64,7 +64,7 @@ override public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Obj return doInvoke(tld, arg1, arg2, arg3, arg4, RT.list(arg5)); } -override public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Cons args) +override public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, ISeq args) /*throws Exception*/ { return doInvoke(tld, arg1, arg2, arg3, arg4, RT.listStar(arg5, args)); diff --git a/src/cli/runtime/RestFn5.cs b/src/cli/runtime/RestFn5.cs index e4ea5fe7..74092dc0 100644 --- a/src/cli/runtime/RestFn5.cs +++ b/src/cli/runtime/RestFn5.cs @@ -18,46 +18,46 @@ namespace org.clojure.runtime public abstract class RestFn5 : AFn{
public abstract Object doInvoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, - Cons rest) + ISeq rest) /*throws Exception*/; -override public Object applyTo(ThreadLocalData tld, Cons arglist) /*throws Exception*/ +override public Object applyTo(ThreadLocalData tld, ISeq arglist) /*throws Exception*/ {
switch (RT.boundedLength(arglist, 5))
{
case 0:
return invoke(tld);
case 1:
- return invoke(tld, arglist.first);
+ return invoke(tld, arglist.first());
case 2:
- return invoke(tld, arglist.first
- , (arglist = arglist.rest).first
+ return invoke(tld, arglist.first()
+ , (arglist = arglist.rest()).first()
);
case 3:
- return invoke(tld, arglist.first
- , (arglist = arglist.rest).first
- , (arglist = arglist.rest).first
+ return invoke(tld, arglist.first()
+ , (arglist = arglist.rest()).first()
+ , (arglist = arglist.rest()).first()
);
case 4:
- return invoke(tld, arglist.first
- , (arglist = arglist.rest).first
- , (arglist = arglist.rest).first
- , (arglist = arglist.rest).first
+ return invoke(tld, arglist.first()
+ , (arglist = arglist.rest()).first()
+ , (arglist = arglist.rest()).first()
+ , (arglist = arglist.rest()).first()
);
case 5:
- return invoke(tld, arglist.first
- , (arglist = arglist.rest).first
- , (arglist = arglist.rest).first
- , (arglist = arglist.rest).first
- , (arglist = arglist.rest).first
+ return invoke(tld, arglist.first()
+ , (arglist = arglist.rest()).first()
+ , (arglist = arglist.rest()).first()
+ , (arglist = arglist.rest()).first()
+ , (arglist = arglist.rest()).first()
);
default:
- return doInvoke(tld, arglist.first
- , (arglist = arglist.rest).first
- , (arglist = arglist.rest).first
- , (arglist = arglist.rest).first
- , (arglist = arglist.rest).first
- , arglist.rest);
+ return doInvoke(tld, arglist.first()
+ , (arglist = arglist.rest()).first()
+ , (arglist = arglist.rest()).first()
+ , (arglist = arglist.rest()).first()
+ , (arglist = arglist.rest()).first()
+ , arglist.rest());
} } @@ -68,7 +68,7 @@ override public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Obj return doInvoke(tld, arg1, arg2, arg3, arg4, arg5, null); } -override public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Cons args) +override public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, ISeq args) /*throws Exception*/ { return doInvoke(tld, arg1, arg2, arg3, arg4, arg5, args); diff --git a/src/cli/runtime/Transaction.cs b/src/cli/runtime/Transaction.cs index 5a66bc38..e3490548 100644 --- a/src/cli/runtime/Transaction.cs +++ b/src/cli/runtime/Transaction.cs @@ -47,7 +47,7 @@ Info info; int startSeq;
Dictionary<TRef,Object> sets;
-Dictionary<TRef,Cons> commutates;
+Dictionary<TRef,ISeq> commutates;
static public Object runInTransaction(ThreadLocalData tld,IFn fn) {
@@ -125,14 +125,14 @@ Object run(ThreadLocalData tld, IFn fn) { //at this point all write targets are locked
//turn commutates into sets
- foreach(KeyValuePair<TRef, Cons> e in commutates)
+ foreach(KeyValuePair<TRef, ISeq> e in commutates)
{
TRef tref = e.Key;
//note this will npe if tref has never been set, as designed
Object val = getCurrent(tref).val;
- for(Cons c = e.Value;c!=null;c = c.rest)
+ for(ISeq c = e.Value;c!=null;c = c.rest())
{
- IFn f = (IFn) c.first;
+ IFn f = (IFn) c.first();
val = f.invoke(tld, val);
}
sets[tref] = val;
@@ -229,7 +229,7 @@ void touch(TRef tref) { void commutate(TRef tref, IFn fn) {
if(commutates == null)
- commutates = new Dictionary<TRef,Cons>();
+ commutates = new Dictionary<TRef,ISeq>();
if(sets != null && sets.ContainsKey(tref))
throw new Exception("Can't commutate and set a TRef in the same transaction");
commutates[tref] = RT.cons(fn, commutates[tref]);
diff --git a/src/cli/runtime/Var.cs b/src/cli/runtime/Var.cs index 7354a5ed..93e9b6ca 100644 --- a/src/cli/runtime/Var.cs +++ b/src/cli/runtime/Var.cs @@ -21,5 +21,5 @@ public readonly Symbol sym;
public Namespace ns;
public Box binding;
public IFn else
this.fn = null; //todo, bind to throw stub?
return this;
}
public Box getBinding(ThreadLocalData tld)
{
Box b = getDynamicBinding(tld);
if(b != null)
return b;
return binding;
}
public Object getValue(ThreadLocalData tld)
{
Box binding = getBinding(tld);
if(binding != null)
return binding.val;
throw new InvalidOperationException(this.toString() + " is unbound.");
}
public Object setValue(ThreadLocalData tld, Object val)
{
Box b = getDynamicBinding(tld);
if(b != null)
return b.val = val;
//allow global set to create binding like this?
if(binding == null)
throw new InvalidOperationException(this.toString() + " is unbound.");
if(val is IFn)
this.fn = (IFn) val;
else
this.fn = null; //todo, bind to throw stub?
return binding.val = val;
}
public Box getDynamicBinding(ThreadLocalData tld)
{
return (Box) tld.dynamicBindings[this];
}
public Box establishDynamicBinding(ThreadLocalData tld, Object val)
{
Box ret = getDynamicBinding(tld);
tld.dynamicBindings[this] = new Box(val);
return ret;
}
public void restoreDynamicBinding(ThreadLocalData tld, Box old)
{
tld.dynamicBindings[this] = old;
- }
override public Object invoke(ThreadLocalData tld) /*throws Exception*/
{
return fn.invoke(tld);
}
override public Object invoke(ThreadLocalData tld, Object arg1) /*throws Exception*/
{
return fn.invoke(tld,arg1);
}
override public Object invoke(ThreadLocalData tld, Object arg1, Object arg2) /*throws Exception*/
{
return fn.invoke(tld,arg1,arg2);
}
override public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3) /*throws Exception*/
{
return fn.invoke(tld,arg1,arg2,arg3);
}
override public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4) /*throws Exception*/
{
return fn.invoke(tld,arg1,arg2,arg3,arg4);
}
override public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5)
/*throws Exception*/
{
return fn.invoke(tld,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 fn.invoke(tld,arg1,arg2,arg3,arg4,arg5,args);
}
}
+ }
override public Object invoke(ThreadLocalData tld) /*throws Exception*/
{
return fn.invoke(tld);
}
override public Object invoke(ThreadLocalData tld, Object arg1) /*throws Exception*/
{
return fn.invoke(tld,arg1);
}
override public Object invoke(ThreadLocalData tld, Object arg1, Object arg2) /*throws Exception*/
{
return fn.invoke(tld,arg1,arg2);
}
override public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3) /*throws Exception*/
{
return fn.invoke(tld,arg1,arg2,arg3);
}
override public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4) /*throws Exception*/
{
return fn.invoke(tld,arg1,arg2,arg3,arg4);
}
override public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5)
/*throws Exception*/
{
return fn.invoke(tld,arg1,arg2,arg3,arg4,arg5);
}
override public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, ISeq args)
/*throws Exception*/
{
return fn.invoke(tld,arg1,arg2,arg3,arg4,arg5,args);
}
}
}
diff --git a/src/org/clojure/runtime/AFn.java b/src/org/clojure/runtime/AFn.java index 323fe732..653a0e6d 100644 --- a/src/org/clojure/runtime/AFn.java +++ b/src/org/clojure/runtime/AFn.java @@ -45,52 +45,52 @@ public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, return throwArity(); } -public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Cons args) +public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, ISeq args) throws Exception { return throwArity(); } -public Object applyTo(ThreadLocalData tld, Cons arglist) throws Exception { +public Object applyTo(ThreadLocalData tld, ISeq arglist) throws Exception { return applyToHelper(this, tld, arglist); } -static public Object applyToHelper(IFn ifn,ThreadLocalData tld, Cons arglist) throws Exception +static public Object applyToHelper(IFn ifn,ThreadLocalData tld, ISeq arglist) throws Exception { switch(RT.boundedLength(arglist, 5)) { case 0: return ifn.invoke(tld); case 1: - return ifn.invoke(tld, arglist.first); + return ifn.invoke(tld, arglist.first()); case 2: - return ifn.invoke(tld, arglist.first - , (arglist = arglist.rest).first + return ifn.invoke(tld, arglist.first() + , (arglist = arglist.rest()).first() ); case 3: - return ifn.invoke(tld, arglist.first - , (arglist = arglist.rest).first - , (arglist = arglist.rest).first + return ifn.invoke(tld, arglist.first() + , (arglist = arglist.rest()).first() + , (arglist = arglist.rest()).first() ); case 4: - return ifn.invoke(tld, arglist.first - , (arglist = arglist.rest).first - , (arglist = arglist.rest).first - , (arglist = arglist.rest).first + return ifn.invoke(tld, arglist.first() + , (arglist = arglist.rest()).first() + , (arglist = arglist.rest()).first() + , (arglist = arglist.rest()).first() ); case 5: - return ifn.invoke(tld, arglist.first - , (arglist = arglist.rest).first - , (arglist = arglist.rest).first - , (arglist = arglist.rest).first - , (arglist = arglist.rest).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 ifn.invoke(tld, arglist.first - , (arglist = arglist.rest).first - , (arglist = arglist.rest).first - , (arglist = arglist.rest).first - , (arglist = arglist.rest).first - , arglist.rest); + return ifn.invoke(tld, arglist.first() + , (arglist = arglist.rest()).first() + , (arglist = arglist.rest()).first() + , (arglist = arglist.rest()).first() + , (arglist = arglist.rest()).first() + , arglist.rest()); } } diff --git a/src/org/clojure/runtime/Accessor.java b/src/org/clojure/runtime/Accessor.java index b69bb0bb..cf046c68 100644 --- a/src/org/clojure/runtime/Accessor.java +++ b/src/org/clojure/runtime/Accessor.java @@ -70,13 +70,13 @@ public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, return Reflector.invokeInstanceMember(memberName,arg1,arg2,arg3,arg4,arg5); } -public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Cons args) +public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, ISeq args) throws Exception { return Reflector.invokeInstanceMember(memberName,arg1,arg2,arg3,arg4,arg5,args); } -public Object applyTo(ThreadLocalData tld, Cons arglist) throws Exception { +public Object applyTo(ThreadLocalData tld, ISeq arglist) throws Exception { return AFn.applyToHelper(this, tld, arglist); } diff --git a/src/org/clojure/runtime/Cons.java b/src/org/clojure/runtime/Cons.java index 8cdd3bd9..1a1c1de9 100644 --- a/src/org/clojure/runtime/Cons.java +++ b/src/org/clojure/runtime/Cons.java @@ -12,25 +12,26 @@ package org.clojure.runtime; -public class Cons extends Obj implements Iter{ +public class Cons implements ISeq, ISequential{ -public final Object first; -public final Cons rest; +private final Object _first; +private final ISeq _rest; -public Cons(Object first, Cons rest) +public Cons(Object first, ISeq rest) { - this.first = first; - this.rest = rest; + this._first = first; + this._rest = rest; } -public Object get() - { - return first; - } +public Object first() { + return _first; +} -public Iter iterate() - { - return rest; - } +public ISeq rest() { + return _rest; +} +public ISeq seq() { + return this; +} } diff --git a/src/org/clojure/runtime/IFn.java b/src/org/clojure/runtime/IFn.java index f5d1194f..6e4c8551 100644 --- a/src/org/clojure/runtime/IFn.java +++ b/src/org/clojure/runtime/IFn.java @@ -28,7 +28,7 @@ public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, throws Exception; public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, - Cons args) throws Exception; + ISeq args) throws Exception; -public Object applyTo(ThreadLocalData tld, Cons arglist) throws Exception; +public Object applyTo(ThreadLocalData tld, ISeq arglist) throws Exception; } diff --git a/src/org/clojure/runtime/ISeq.java b/src/org/clojure/runtime/ISeq.java new file mode 100644 index 00000000..76b70f94 --- /dev/null +++ b/src/org/clojure/runtime/ISeq.java @@ -0,0 +1,24 @@ +package org.clojure.runtime;
+
+/**
+ * Copyright (c) Rich Hickey. All rights reserved.
+ * The use and distribution terms for this software are covered by the
+ * Common Public License 1.0 (http://opensource.org/licenses/cpl.php)
+ * which can be found in the file CPL.TXT at the root of this distribution.
+ * By using this software in any fashion, you are agreeing to be bound by
+ * the terms of this license.
+ * You must not remove this notice, or any other, from this software.
+ */
+
+/**
+ * A persistent, functional, sequence interface
+ *
+ * ISeqs are immutable values, i.e. neither first(), nor rest() changes
+ * or invalidates the ISeq
+ */
+public interface ISeq {
+
+Object first();
+
+ISeq rest();
+}
diff --git a/src/org/clojure/runtime/ISequential.java b/src/org/clojure/runtime/ISequential.java new file mode 100644 index 00000000..943e44b2 --- /dev/null +++ b/src/org/clojure/runtime/ISequential.java @@ -0,0 +1,18 @@ +package org.clojure.runtime;
+
+/**
+ * Copyright (c) Rich Hickey. All rights reserved.
+ * The use and distribution terms for this software are covered by the
+ * Common Public License 1.0 (http://opensource.org/licenses/cpl.php)
+ * which can be found in the file CPL.TXT at the root of this distribution.
+ * By using this software in any fashion, you are agreeing to be bound by
+ * the terms of this license.
+ * You must not remove this notice, or any other, from this software.
+ */
+
+
+public interface ISequential {
+
+ISeq seq();
+
+}
diff --git a/src/org/clojure/runtime/Keyword.java b/src/org/clojure/runtime/Keyword.java index 63ea4d7d..e4012e56 100644 --- a/src/org/clojure/runtime/Keyword.java +++ b/src/org/clojure/runtime/Keyword.java @@ -77,13 +77,13 @@ public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, return AFn.throwArity(); } -public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Cons args) +public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, ISeq args) throws Exception { return AFn.throwArity(); } -public Object applyTo(ThreadLocalData tld, Cons arglist) throws Exception { +public Object applyTo(ThreadLocalData tld, ISeq arglist) throws Exception { return AFn.applyToHelper(this, tld, arglist); } } diff --git a/src/org/clojure/runtime/RT.java b/src/org/clojure/runtime/RT.java index 4298a4c9..888e925b 100644 --- a/src/org/clojure/runtime/RT.java +++ b/src/org/clojure/runtime/RT.java @@ -49,18 +49,18 @@ public class RT{ return null; } - static public Object equal(Object arg1, Object arg2) { - if(arg1 == null) - return arg2 == null ? Boolean.TRUE : null; - else if(arg2 == null) - return null; - return (eql(arg1,arg2) != null - || (arg1.getClass() == Cons.class - && arg2.getClass() == Cons.class - && equal(((Cons)arg1).first,((Cons)arg2).first)!=null - && equal(((Cons)arg1).rest,((Cons)arg2).rest)!=null)) - ?Boolean.TRUE:null; - } +// static public Object equal(Object arg1, Object arg2) { +// if(arg1 == null) +// return arg2 == null ? Boolean.TRUE : null; +// else if(arg2 == null) +// return null; +// return (eql(arg1,arg2) != null +// || (arg1.getClass() == Cons.class +// && arg2.getClass() == Cons.class +// && equal(((Cons)arg1)._first,((Cons)arg2)._first)!=null +// && equal(((Cons)arg1)._rest,((Cons)arg2)._rest)!=null)) +// ?Boolean.TRUE:null; +// } static public Iter iter(Object coll) { @@ -174,7 +174,7 @@ static public double doubleCast(Object x) /******************************************* list support ********************************/ -static public Cons cons(Object x, Cons y) +static public Cons cons(Object x, ISeq y) { return new Cons(x, y); } @@ -209,27 +209,27 @@ static public Cons list(Object arg1, Object arg2, Object arg3, Object arg4, Obje return listStar(arg1, arg2, arg3, arg4, arg5, null); } -static public Cons listStar(Object arg1, Cons rest) +static public Cons listStar(Object arg1, ISeq rest) { return cons(arg1, rest); } -static public Cons listStar(Object arg1, Object arg2, Cons rest) +static public Cons listStar(Object arg1, Object arg2, ISeq rest) { return cons(arg1, cons(arg2, rest)); } -static public Cons listStar(Object arg1, Object arg2, Object arg3, Cons rest) +static public Cons listStar(Object arg1, Object arg2, Object arg3, ISeq rest) { return cons(arg1, cons(arg2, cons(arg3, rest))); } -static public Cons listStar(Object arg1, Object arg2, Object arg3, Object arg4, Cons rest) +static public Cons listStar(Object arg1, Object arg2, Object arg3, Object arg4, ISeq rest) { return cons(arg1, cons(arg2, cons(arg3, cons(arg4, rest)))); } -static public Cons listStar(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Cons rest) +static public Cons listStar(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, ISeq rest) { return cons(arg1, cons(arg2, cons(arg3, cons(arg4, cons(arg5, rest))))); } @@ -241,20 +241,20 @@ static public Cons arrayToList(Object[] a){ return ret; } -static public int length(Cons list) +static public int length(ISeq list) { int i = 0; - for(Cons c = list; c != null; c = c.rest) + for(ISeq c = list; c != null; c = c.rest()) { i++; } return i; } -static public int boundedLength(Cons list, int limit) +static public int boundedLength(ISeq list, int limit) { int i = 0; - for(Cons c = list; c != null && i <= limit; c = c.rest) + for(ISeq c = list; c != null && i <= limit; c = c.rest()) { i++; } @@ -367,7 +367,7 @@ static public Object setValues(ThreadLocalData tld, Object arg1, Object arg2, Ob } static public Object setValues(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4, - Object arg5, Cons args) throws Exception + Object arg5, ISeq args) throws Exception { if(tld == null) tld = ThreadLocalData.get(); @@ -377,9 +377,9 @@ static public Object setValues(ThreadLocalData tld, Object arg1, Object arg2, Ob tld.mvArray[2] = arg3; tld.mvArray[3] = arg4; tld.mvArray[4] = arg5; - for(int i = 5; args != null && i < ThreadLocalData.MULTIPLE_VALUES_LIMIT; i++, args = args.rest) + for(int i = 5; args != null && i < ThreadLocalData.MULTIPLE_VALUES_LIMIT; i++, args = args.rest()) { - tld.mvArray[i] = args.first; + tld.mvArray[i] = args.first(); } if(args != null) throw new IllegalArgumentException("Too many arguments to values (> ThreadLocalData.MULTIPLE_VALUES_LIMIT)"); diff --git a/src/org/clojure/runtime/Reflector.java b/src/org/clojure/runtime/Reflector.java index c81a6341..f101b3b5 100644 --- a/src/org/clojure/runtime/Reflector.java +++ b/src/org/clojure/runtime/Reflector.java @@ -167,7 +167,7 @@ public static Object invokeInstanceMember(String name, Object target, Object arg public static Object invokeInstanceMember(String name, Object target, Object arg1, Object arg2, Object arg3, Object arg4, - Cons arglist) + ISeq arglist) throws Exception { Object[] args = new Object[4 + RT.length(arglist)]; @@ -175,8 +175,8 @@ public static Object invokeInstanceMember(String name, Object target, Object arg args[1] = arg2; args[2] = arg3; args[3] = arg4; - for(int i = 4; arglist != null; i++, arglist = arglist.rest) - args[i] = arglist.first; + for(int i = 4; arglist != null; i++, arglist = arglist.rest()) + args[i] = arglist.first(); return invokeInstanceMethod(name, target, args); } diff --git a/src/org/clojure/runtime/RestFn0.java b/src/org/clojure/runtime/RestFn0.java index b6886c8b..8bdc2629 100644 --- a/src/org/clojure/runtime/RestFn0.java +++ b/src/org/clojure/runtime/RestFn0.java @@ -14,9 +14,9 @@ package org.clojure.runtime; public abstract class RestFn0 extends AFn{ -protected abstract Object doInvoke(ThreadLocalData tld, Cons rest) throws Exception; +protected abstract Object doInvoke(ThreadLocalData tld, ISeq rest) throws Exception; -public Object applyTo(ThreadLocalData tld, Cons arglist) throws Exception +public Object applyTo(ThreadLocalData tld, ISeq arglist) throws Exception { return doInvoke(tld, arglist); } @@ -52,7 +52,7 @@ public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, return doInvoke(tld, RT.list(arg1, arg2, arg3, arg4, arg5)); } -public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Cons args) +public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, ISeq args) throws Exception { return doInvoke(tld, RT.listStar(arg1, arg2, arg3, arg4, arg5, args)); diff --git a/src/org/clojure/runtime/RestFn1.java b/src/org/clojure/runtime/RestFn1.java index f763b0c4..054f1960 100644 --- a/src/org/clojure/runtime/RestFn1.java +++ b/src/org/clojure/runtime/RestFn1.java @@ -14,19 +14,19 @@ package org.clojure.runtime; public abstract class RestFn1 extends AFn{ -protected abstract Object doInvoke(ThreadLocalData tld, Object arg1, Cons rest) throws Exception; +protected abstract Object doInvoke(ThreadLocalData tld, Object arg1, ISeq rest) throws Exception; -public Object applyTo(ThreadLocalData tld, Cons arglist) throws Exception +public Object applyTo(ThreadLocalData tld, ISeq arglist) throws Exception { switch(RT.boundedLength(arglist, 1)) { case 0: return invoke(tld); case 1: - return invoke(tld,arglist.first); + return invoke(tld,arglist.first()); default: - return doInvoke(tld, arglist.first - , arglist.rest); + return doInvoke(tld, arglist.first() + , arglist.rest()); } } @@ -56,7 +56,7 @@ public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, return doInvoke(tld, arg1, RT.list(arg2, arg3, arg4, arg5)); } -public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Cons args) +public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, ISeq args) throws Exception { return doInvoke(tld, arg1, RT.listStar(arg2, arg3, arg4, arg5, args)); diff --git a/src/org/clojure/runtime/RestFn2.java b/src/org/clojure/runtime/RestFn2.java index 8f12ade0..f8aafa79 100644 --- a/src/org/clojure/runtime/RestFn2.java +++ b/src/org/clojure/runtime/RestFn2.java @@ -14,24 +14,24 @@ package org.clojure.runtime; public abstract class RestFn2 extends AFn{ -protected abstract Object doInvoke(ThreadLocalData tld, Object arg1, Object arg2, Cons rest) throws Exception; +protected abstract Object doInvoke(ThreadLocalData tld, Object arg1, Object arg2, ISeq rest) throws Exception; -public Object applyTo(ThreadLocalData tld, Cons arglist) throws Exception +public Object applyTo(ThreadLocalData tld, ISeq arglist) throws Exception { switch(RT.boundedLength(arglist, 2)) { case 0: return invoke(tld); case 1: - return invoke(tld,arglist.first); + return invoke(tld,arglist.first()); case 2: - return invoke(tld,arglist.first - , (arglist = arglist.rest).first + return invoke(tld,arglist.first() + , (arglist = arglist.rest()).first() ); default: - return doInvoke(tld, arglist.first - , (arglist = arglist.rest).first - , arglist.rest); + return doInvoke(tld, arglist.first() + , (arglist = arglist.rest()).first() + , arglist.rest()); } } @@ -57,7 +57,7 @@ public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, return doInvoke(tld, arg1, arg2, RT.list(arg3, arg4, arg5)); } -public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Cons args) +public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, ISeq args) throws Exception { return doInvoke(tld, arg1, arg2, RT.listStar(arg3, arg4, arg5, args)); diff --git a/src/org/clojure/runtime/RestFn3.java b/src/org/clojure/runtime/RestFn3.java index 9efcbc3e..70bceb95 100644 --- a/src/org/clojure/runtime/RestFn3.java +++ b/src/org/clojure/runtime/RestFn3.java @@ -14,30 +14,30 @@ package org.clojure.runtime; public abstract class RestFn3 extends AFn{ -protected abstract Object doInvoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Cons rest) throws Exception; +protected abstract Object doInvoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, ISeq rest) throws Exception; -public Object applyTo(ThreadLocalData tld, Cons arglist) throws Exception +public Object applyTo(ThreadLocalData tld, ISeq arglist) throws Exception { switch(RT.boundedLength(arglist, 3)) { case 0: return invoke(tld); case 1: - return invoke(tld,arglist.first); + return invoke(tld,arglist.first()); case 2: - return invoke(tld,arglist.first - , (arglist = arglist.rest).first + return invoke(tld,arglist.first() + , (arglist = arglist.rest()).first() ); case 3: - return invoke(tld,arglist.first - , (arglist = arglist.rest).first - , (arglist = arglist.rest).first + return invoke(tld,arglist.first() + , (arglist = arglist.rest()).first() + , (arglist = arglist.rest()).first() ); default: - return doInvoke(tld, arglist.first - , (arglist = arglist.rest).first - , (arglist = arglist.rest).first - , arglist.rest); + return doInvoke(tld, arglist.first() + , (arglist = arglist.rest()).first() + , (arglist = arglist.rest()).first() + , arglist.rest()); } } @@ -59,7 +59,7 @@ public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, return doInvoke(tld, arg1, arg2, arg3, RT.list(arg4, arg5)); } -public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Cons args) +public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, ISeq args) throws Exception { return doInvoke(tld, arg1, arg2, arg3, RT.listStar(arg4, arg5, args)); diff --git a/src/org/clojure/runtime/RestFn4.java b/src/org/clojure/runtime/RestFn4.java index 1114bce1..1be448b0 100644 --- a/src/org/clojure/runtime/RestFn4.java +++ b/src/org/clojure/runtime/RestFn4.java @@ -14,38 +14,38 @@ package org.clojure.runtime; public abstract class RestFn4 extends AFn{ -protected abstract Object doInvoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4, Cons rest) +protected abstract Object doInvoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4, ISeq rest) throws Exception; -public Object applyTo(ThreadLocalData tld, Cons arglist) throws Exception +public Object applyTo(ThreadLocalData tld, ISeq arglist) throws Exception { switch(RT.boundedLength(arglist, 4)) { case 0: return invoke(tld); case 1: - return invoke(tld,arglist.first); + return invoke(tld,arglist.first()); case 2: - return invoke(tld,arglist.first - , (arglist = arglist.rest).first + return invoke(tld,arglist.first() + , (arglist = arglist.rest()).first() ); case 3: - return invoke(tld,arglist.first - , (arglist = arglist.rest).first - , (arglist = arglist.rest).first + return invoke(tld,arglist.first() + , (arglist = arglist.rest()).first() + , (arglist = arglist.rest()).first() ); case 4: - return invoke(tld,arglist.first - , (arglist = arglist.rest).first - , (arglist = arglist.rest).first - , (arglist = arglist.rest).first + return invoke(tld,arglist.first() + , (arglist = arglist.rest()).first() + , (arglist = arglist.rest()).first() + , (arglist = arglist.rest()).first() ); default: - return doInvoke(tld, arglist.first - , (arglist = arglist.rest).first - , (arglist = arglist.rest).first - , (arglist = arglist.rest).first - , arglist.rest); + return doInvoke(tld, arglist.first() + , (arglist = arglist.rest()).first() + , (arglist = arglist.rest()).first() + , (arglist = arglist.rest()).first() + , arglist.rest()); } } @@ -61,7 +61,7 @@ public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, return doInvoke(tld, arg1, arg2, arg3, arg4, RT.list(arg5)); } -public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Cons args) +public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, ISeq args) throws Exception { return doInvoke(tld, arg1, arg2, arg3, arg4, RT.listStar(arg5, args)); diff --git a/src/org/clojure/runtime/RestFn5.java b/src/org/clojure/runtime/RestFn5.java index 7b8b414a..8a16fdd9 100644 --- a/src/org/clojure/runtime/RestFn5.java +++ b/src/org/clojure/runtime/RestFn5.java @@ -15,46 +15,46 @@ package org.clojure.runtime; public abstract class RestFn5 extends AFn{ protected abstract Object doInvoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, - Cons rest) + ISeq rest) throws Exception; -public Object applyTo(ThreadLocalData tld, Cons arglist) throws Exception +public Object applyTo(ThreadLocalData tld, ISeq arglist) throws Exception { switch(RT.boundedLength(arglist, 5)) { case 0: return invoke(tld); case 1: - return invoke(tld,arglist.first); + return invoke(tld,arglist.first()); case 2: - return invoke(tld,arglist.first - , (arglist = arglist.rest).first + return invoke(tld,arglist.first() + , (arglist = arglist.rest()).first() ); case 3: - return invoke(tld,arglist.first - , (arglist = arglist.rest).first - , (arglist = arglist.rest).first + return invoke(tld,arglist.first() + , (arglist = arglist.rest()).first() + , (arglist = arglist.rest()).first() ); case 4: - return invoke(tld,arglist.first - , (arglist = arglist.rest).first - , (arglist = arglist.rest).first - , (arglist = arglist.rest).first + return invoke(tld,arglist.first() + , (arglist = arglist.rest()).first() + , (arglist = arglist.rest()).first() + , (arglist = arglist.rest()).first() ); case 5: - return invoke(tld,arglist.first - , (arglist = arglist.rest).first - , (arglist = arglist.rest).first - , (arglist = arglist.rest).first - , (arglist = arglist.rest).first + return invoke(tld,arglist.first() + , (arglist = arglist.rest()).first() + , (arglist = arglist.rest()).first() + , (arglist = arglist.rest()).first() + , (arglist = arglist.rest()).first() ); default: - return doInvoke(tld, arglist.first - , (arglist = arglist.rest).first - , (arglist = arglist.rest).first - , (arglist = arglist.rest).first - , (arglist = arglist.rest).first - , arglist.rest); + return doInvoke(tld, arglist.first() + , (arglist = arglist.rest()).first() + , (arglist = arglist.rest()).first() + , (arglist = arglist.rest()).first() + , (arglist = arglist.rest()).first() + , arglist.rest()); } } @@ -65,7 +65,7 @@ public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, return doInvoke(tld, arg1, arg2, arg3, arg4, arg5, null); } -public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Cons args) +public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, ISeq args) throws Exception { return doInvoke(tld, arg1, arg2, arg3, arg4, arg5, args); diff --git a/src/org/clojure/runtime/Transaction.java b/src/org/clojure/runtime/Transaction.java index d6f4cab6..79de28c0 100644 --- a/src/org/clojure/runtime/Transaction.java +++ b/src/org/clojure/runtime/Transaction.java @@ -44,7 +44,7 @@ Info info; int startSeq; IdentityHashMap<TRef,Object> sets; -IdentityHashMap<TRef,Cons> commutates; +IdentityHashMap<TRef,ISeq> commutates; static public Object runInTransaction(ThreadLocalData tld,IFn fn) throws Exception{ @@ -123,14 +123,14 @@ Object run(ThreadLocalData tld, IFn fn) throws Exception{ //at this point all write targets are locked //turn commutates into sets - for(Map.Entry<TRef, Cons> e : commutates.entrySet()) + for(Map.Entry<TRef, ISeq> e : commutates.entrySet()) { TRef tref = e.getKey(); //note this will npe if tref has never been set, as designed Object val = getCurrent(tref).val; - for(Cons c = e.getValue();c!=null;c = c.rest) + for(ISeq c = e.getValue();c!=null;c = c.rest()) { - IFn f = (IFn) c.first; + IFn f = (IFn) c.first(); val = f.invoke(tld, val); } sets.put(tref, val); @@ -225,7 +225,7 @@ void touch(TRef tref) throws Exception{ void commutate(TRef tref, IFn fn) throws Exception{ if(commutates == null) - commutates = new IdentityHashMap<TRef,Cons>(); + commutates = new IdentityHashMap<TRef,ISeq>(); if(sets != null && sets.containsKey(tref)) throw new Exception("Can't commutate and set a TRef in the same transaction"); commutates.put(tref, RT.cons(fn, commutates.get(tref))); diff --git a/src/org/clojure/runtime/Var.java b/src/org/clojure/runtime/Var.java index 9e6fe46f..ee896ca6 100644 --- a/src/org/clojure/runtime/Var.java +++ b/src/org/clojure/runtime/Var.java @@ -131,7 +131,7 @@ public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, return fn.invoke(tld,arg1,arg2,arg3,arg4,arg5); } -public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Cons args) +public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, ISeq args) throws Exception { return fn.invoke(tld,arg1,arg2,arg3,arg4,arg5,args); |