summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2006-06-09 12:42:56 +0000
committerRich Hickey <richhickey@gmail.com>2006-06-09 12:42:56 +0000
commit4f72b81de88948e149af93dd96406e4f519e15c6 (patch)
treee4bdf36a13c6fbd2bee70eceada82aef7bf9b945 /src
parent3e18fcb60b00f869f74b112af5b5d90b9a9edba0 (diff)
added ISeq, ISequential, modified Cons
Diffstat (limited to 'src')
-rw-r--r--src/cli/runtime/AFn.cs48
-rw-r--r--src/cli/runtime/Accessor.cs4
-rw-r--r--src/cli/runtime/Cons.cs33
-rw-r--r--src/cli/runtime/IFn.cs4
-rw-r--r--src/cli/runtime/ISeq.cs22
-rw-r--r--src/cli/runtime/ISequential.cs22
-rw-r--r--src/cli/runtime/Keyword.cs4
-rw-r--r--src/cli/runtime/PersistentTree.cs4
-rw-r--r--src/cli/runtime/RT.cs50
-rw-r--r--src/cli/runtime/Reflector.cs2
-rw-r--r--src/cli/runtime/RestFn0.cs6
-rw-r--r--src/cli/runtime/RestFn1.cs12
-rw-r--r--src/cli/runtime/RestFn2.cs18
-rw-r--r--src/cli/runtime/RestFn3.cs26
-rw-r--r--src/cli/runtime/RestFn4.cs36
-rw-r--r--src/cli/runtime/RestFn5.cs48
-rw-r--r--src/cli/runtime/Transaction.cs10
-rw-r--r--src/cli/runtime/Var.cs2
-rw-r--r--src/org/clojure/runtime/AFn.java48
-rw-r--r--src/org/clojure/runtime/Accessor.java4
-rw-r--r--src/org/clojure/runtime/Cons.java29
-rw-r--r--src/org/clojure/runtime/IFn.java4
-rw-r--r--src/org/clojure/runtime/ISeq.java24
-rw-r--r--src/org/clojure/runtime/ISequential.java18
-rw-r--r--src/org/clojure/runtime/Keyword.java4
-rw-r--r--src/org/clojure/runtime/RT.java50
-rw-r--r--src/org/clojure/runtime/Reflector.java6
-rw-r--r--src/org/clojure/runtime/RestFn0.java6
-rw-r--r--src/org/clojure/runtime/RestFn1.java12
-rw-r--r--src/org/clojure/runtime/RestFn2.java18
-rw-r--r--src/org/clojure/runtime/RestFn3.java26
-rw-r--r--src/org/clojure/runtime/RestFn4.java36
-rw-r--r--src/org/clojure/runtime/RestFn5.java48
-rw-r--r--src/org/clojure/runtime/Transaction.java10
-rw-r--r--src/org/clojure/runtime/Var.java2
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);