diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/boot.clj | 8 | ||||
-rw-r--r-- | src/jvm/clojure/lang/APersistentVector.java | 2 | ||||
-rw-r--r-- | src/jvm/clojure/lang/ASeq.java | 26 | ||||
-rw-r--r-- | src/jvm/clojure/lang/ArraySeq.java | 10 | ||||
-rw-r--r-- | src/jvm/clojure/lang/IReduce.java | 19 | ||||
-rw-r--r-- | src/jvm/clojure/lang/ISeq.java | 4 | ||||
-rw-r--r-- | src/jvm/clojure/lang/PersistentList.java | 16 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Range.java | 2 |
8 files changed, 60 insertions, 27 deletions
diff --git a/src/boot.clj b/src/boot.clj index ad0cf15a..410a9cf9 100644 --- a/src/boot.clj +++ b/src/boot.clj @@ -442,12 +442,16 @@ ([f coll] (let [s (seq coll)] (if s - (. s (reduce f)) + (if (instance? clojure.lang.IReduce s) + (. s (reduce f)) + (reduce f (first s) (rest s))) (f)))) ([f val coll] (let [s (seq coll)] (if s - (. s (reduce f val)) + (if (instance? clojure.lang.IReduce s) + (. s (reduce f val)) + (recur f (f val (first s)) (rest s))) val)))) (defn reverse diff --git a/src/jvm/clojure/lang/APersistentVector.java b/src/jvm/clojure/lang/APersistentVector.java index 46dfbb25..de16efda 100644 --- a/src/jvm/clojure/lang/APersistentVector.java +++ b/src/jvm/clojure/lang/APersistentVector.java @@ -230,7 +230,7 @@ public int length(){ return count(); } -static class Seq extends ASeq implements IndexedSeq{ +static class Seq extends ASeq implements IndexedSeq, IReduce{ //todo - something more efficient final IPersistentVector v; final int i; diff --git a/src/jvm/clojure/lang/ASeq.java b/src/jvm/clojure/lang/ASeq.java index e519621d..89a4546e 100644 --- a/src/jvm/clojure/lang/ASeq.java +++ b/src/jvm/clojure/lang/ASeq.java @@ -58,19 +58,19 @@ public int hashCode(){ return _hash;
}
-public Object reduce(IFn f) throws Exception{
- Object ret = first();
- for(ISeq s = rest(); s != null; s = s.rest())
- ret = f.invoke(ret, s.first());
- return ret;
-}
-
-public Object reduce(IFn f, Object start) throws Exception{
- Object ret = f.invoke(start, first());
- for(ISeq s = rest(); s != null; s = s.rest())
- ret = f.invoke(ret, s.first());
- return ret;
-}
+//public Object reduce(IFn f) throws Exception{
+// Object ret = first();
+// for(ISeq s = rest(); s != null; s = s.rest())
+// ret = f.invoke(ret, s.first());
+// return ret;
+//}
+//
+//public Object reduce(IFn f, Object start) throws Exception{
+// Object ret = f.invoke(start, first());
+// for(ISeq s = rest(); s != null; s = s.rest())
+// ret = f.invoke(ret, s.first());
+// return ret;
+//}
//public Object peek(){
// return first();
diff --git a/src/jvm/clojure/lang/ArraySeq.java b/src/jvm/clojure/lang/ArraySeq.java index c1b7e4d8..9cf79e8f 100644 --- a/src/jvm/clojure/lang/ArraySeq.java +++ b/src/jvm/clojure/lang/ArraySeq.java @@ -14,7 +14,7 @@ package clojure.lang; import java.lang.reflect.Array; -public class ArraySeq extends ASeq implements IndexedSeq{ +public class ArraySeq extends ASeq implements IndexedSeq, IReduce{ final Object array; final int i; //ISeq _rest; @@ -101,7 +101,7 @@ public Object reduce(IFn f, Object start) throws Exception{ //////////////////////////////////// specialized primitive versions /////////////////////////////// -static public class ArraySeq_int extends ASeq implements IndexedSeq{ +static public class ArraySeq_int extends ASeq implements IndexedSeq, IReduce{ final int[] array; final int i; @@ -149,7 +149,7 @@ public Object reduce(IFn f, Object start) throws Exception{ } -static public class ArraySeq_float extends ASeq implements IndexedSeq{ +static public class ArraySeq_float extends ASeq implements IndexedSeq, IReduce{ final float[] array; final int i; @@ -196,7 +196,7 @@ public Object reduce(IFn f, Object start) throws Exception{ } } -static public class ArraySeq_double extends ASeq implements IndexedSeq{ +static public class ArraySeq_double extends ASeq implements IndexedSeq, IReduce{ final double[] array; final int i; @@ -243,7 +243,7 @@ public Object reduce(IFn f, Object start) throws Exception{ } } -static public class ArraySeq_long extends ASeq implements IndexedSeq{ +static public class ArraySeq_long extends ASeq implements IndexedSeq, IReduce{ final long[] array; final int i; diff --git a/src/jvm/clojure/lang/IReduce.java b/src/jvm/clojure/lang/IReduce.java new file mode 100644 index 00000000..83ddf80c --- /dev/null +++ b/src/jvm/clojure/lang/IReduce.java @@ -0,0 +1,19 @@ +/** + * 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. + **/ + +/* rich Jun 11, 2008 */ + +package clojure.lang; + +public interface IReduce{ +Object reduce(IFn f) throws Exception; + +Object reduce(IFn f, Object start) throws Exception; +} diff --git a/src/jvm/clojure/lang/ISeq.java b/src/jvm/clojure/lang/ISeq.java index 2fdd8eec..08c66cf9 100644 --- a/src/jvm/clojure/lang/ISeq.java +++ b/src/jvm/clojure/lang/ISeq.java @@ -24,8 +24,4 @@ ISeq rest(); ISeq cons(Object o);
-Object reduce(IFn f) throws Exception;
-
-Object reduce(IFn f, Object start) throws Exception;
-
}
diff --git a/src/jvm/clojure/lang/PersistentList.java b/src/jvm/clojure/lang/PersistentList.java index 9009f016..930cd887 100644 --- a/src/jvm/clojure/lang/PersistentList.java +++ b/src/jvm/clojure/lang/PersistentList.java @@ -14,7 +14,7 @@ import java.util.List; import java.util.ListIterator;
import java.util.LinkedList;
-public class PersistentList extends ASeq implements IPersistentList{
+public class PersistentList extends ASeq implements IPersistentList, IReduce{
private final Object _first;
private final IPersistentList _rest;
@@ -100,6 +100,20 @@ public PersistentList withMeta(IPersistentMap meta){ return this;
}
+public Object reduce(IFn f) throws Exception{
+ Object ret = first();
+ for(ISeq s = rest(); s != null; s = s.rest())
+ ret = f.invoke(ret, s.first());
+ return ret;
+}
+
+public Object reduce(IFn f, Object start) throws Exception{
+ Object ret = f.invoke(start, first());
+ for(ISeq s = rest(); s != null; s = s.rest())
+ ret = f.invoke(ret, s.first());
+ return ret;
+}
+
static class EmptyList extends Obj implements IPersistentList{
EmptyList(IPersistentMap meta){
diff --git a/src/jvm/clojure/lang/Range.java b/src/jvm/clojure/lang/Range.java index e5d51761..ccb98b19 100644 --- a/src/jvm/clojure/lang/Range.java +++ b/src/jvm/clojure/lang/Range.java @@ -12,7 +12,7 @@ package clojure.lang; -public class Range extends ASeq{ +public class Range extends ASeq implements IReduce{ final int end; final int n; |