diff options
author | Rich Hickey <richhickey@gmail.com> | 2009-02-02 16:40:22 +0000 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2009-02-02 16:40:22 +0000 |
commit | 688633e70fdeeb70c56e2f7dd8e5551378c9d764 (patch) | |
tree | 41df218d56a05b602f531d828b9dbabcec3e9947 | |
parent | 65528bfe81d605eab6fe3e475ada08f55bcc5ab5 (diff) |
[lazy] moving off of lazy-cons - remove, takes, drops
-rw-r--r-- | src/clj/clojure/core.clj | 58 | ||||
-rw-r--r-- | src/jvm/clojure/lang/APersistentMap.java | 4 | ||||
-rw-r--r-- | src/jvm/clojure/lang/APersistentVector.java | 4 | ||||
-rw-r--r-- | src/jvm/clojure/lang/ASeq.java | 19 | ||||
-rw-r--r-- | src/jvm/clojure/lang/ArraySeq.java | 10 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Cons.java | 6 | ||||
-rw-r--r-- | src/jvm/clojure/lang/EnumerationSeq.java | 2 | ||||
-rw-r--r-- | src/jvm/clojure/lang/IteratorSeq.java | 2 | ||||
-rw-r--r-- | src/jvm/clojure/lang/LazyCons.java | 2 | ||||
-rw-r--r-- | src/jvm/clojure/lang/PersistentArrayMap.java | 2 | ||||
-rw-r--r-- | src/jvm/clojure/lang/PersistentHashMap.java | 4 | ||||
-rw-r--r-- | src/jvm/clojure/lang/PersistentList.java | 2 | ||||
-rw-r--r-- | src/jvm/clojure/lang/PersistentQueue.java | 2 | ||||
-rw-r--r-- | src/jvm/clojure/lang/PersistentStructMap.java | 2 | ||||
-rw-r--r-- | src/jvm/clojure/lang/PersistentTreeMap.java | 2 | ||||
-rw-r--r-- | src/jvm/clojure/lang/RT.java | 2 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Range.java | 2 | ||||
-rw-r--r-- | src/jvm/clojure/lang/StreamSeq.java | 2 | ||||
-rw-r--r-- | src/jvm/clojure/lang/StringSeq.java | 2 |
19 files changed, 74 insertions, 55 deletions
diff --git a/src/clj/clojure/core.clj b/src/clj/clojure/core.clj index fc25a32a..3eeee967 100644 --- a/src/clj/clojure/core.clj +++ b/src/clj/clojure/core.clj @@ -834,8 +834,12 @@ (defn complement "Takes a fn f and returns a fn that takes the same arguments as f, has the same effects, if any, and returns the opposite truth value." - [f] (fn [& args] - (not (apply f args)))) + [f] + (fn + ([] (not (f))) + ([x] (not (f x))) + ([x y] (not (f x y))) + ([x y & zs] (not (apply f x y zs))))) (defn constantly "Returns a function that takes any number of arguments and returns x." @@ -1419,9 +1423,8 @@ f should accept number-of-colls arguments." ([f coll] (lazy-seq - (let [s (seq coll)] - (when s - (cons (f (first s)) (map f (more s))))))) + (when (seq coll) + (cons (f (first coll)) (map f (more coll)))))) ([f c1 c2] (lazy-seq (when (and (seq c1) (seq c2)) @@ -1458,47 +1461,50 @@ (defn remove - "Returns a lazy seq of the items in coll for which + "Returns a lazy sequence of the items in coll for which (pred item) returns false. pred must be free of side-effects." [pred coll] - (when (seq coll) - (if (pred (first coll)) - (recur pred (rest coll)) - (lazy-cons (first coll) (remove pred (rest coll)))))) + (filter (complement pred) coll)) (defn take - "Returns a lazy seq of the first n items in coll, or all items if + "Returns a lazy sequence of the first n items in coll, or all items if there are fewer than n." [n coll] - (when (and (pos? n) (seq coll)) - (lazy-cons (first coll) (when (> n 1) (take (dec n) (rest coll)))))) + (lazy-seq + (when (and (pos? n) (seq coll)) + (cons (first coll) (take (dec n) (more coll)))))) (defn take-while - "Returns a lazy seq of successive items from coll while + "Returns a lazy sequence of successive items from coll while (pred item) returns true. pred must be free of side-effects." [pred coll] - (when (and (seq coll) (pred (first coll))) - (lazy-cons (first coll) (take-while pred (rest coll))))) + (lazy-seq + (when (and (seq coll) (pred (first coll))) + (cons (first coll) (take-while pred (more coll)))))) (defn drop - "Returns a lazy seq of all but the first n items in coll." + "Returns a lazy sequence of all but the first n items in coll." [n coll] - (if (and (pos? n) (seq coll)) - (recur (dec n) (rest coll)) - (seq coll))) + (let [step (fn [n coll] + (if (and (pos? n) (seq coll)) + (recur (dec n) (more coll)) + (seq coll)))] + (lazy-seq (step n coll)))) (defn drop-last - "Return a lazy seq of all but the last n (default 1) items in coll" + "Return a lazy sequence of all but the last n (default 1) items in coll" ([s] (drop-last 1 s)) - ([n s] (map (fn [x _] x) (seq s) (drop n s)))) + ([n s] (map (fn [x _] x) s (drop n s)))) (defn drop-while - "Returns a lazy seq of the items in coll starting from the first + "Returns a lazy sequence of the items in coll starting from the first item for which (pred item) returns nil." [pred coll] - (if (and (seq coll) (pred (first coll))) - (recur pred (rest coll)) - (seq coll))) + (let [step (fn [pred coll] + (if (and (seq coll) (pred (first coll))) + (recur pred (more coll)) + (seq coll)))] + (lazy-seq (step pred coll)))) (defn cycle "Returns a lazy (infinite!) seq of repetitions of the items in diff --git a/src/jvm/clojure/lang/APersistentMap.java b/src/jvm/clojure/lang/APersistentMap.java index fd700e0e..4d8bc8f7 100644 --- a/src/jvm/clojure/lang/APersistentMap.java +++ b/src/jvm/clojure/lang/APersistentMap.java @@ -130,7 +130,7 @@ static public class KeySeq extends ASeq{ return ((Map.Entry) seq.first()).getKey();
}
- public Seqable more(){
+ public ISeq rest(){
return create(seq.rest());
}
@@ -161,7 +161,7 @@ static public class ValSeq extends ASeq{ return ((Map.Entry) seq.first()).getValue();
}
- public Seqable more(){
+ public ISeq rest(){
return create(seq.rest());
}
diff --git a/src/jvm/clojure/lang/APersistentVector.java b/src/jvm/clojure/lang/APersistentVector.java index 8e6a85b8..4cb753a8 100644 --- a/src/jvm/clojure/lang/APersistentVector.java +++ b/src/jvm/clojure/lang/APersistentVector.java @@ -438,7 +438,7 @@ public IStream stream() throws Exception { return v.nth(i); } - public Seqable more(){ + public ISeq rest(){ if(i + 1 < v.count()) return new APersistentVector.Seq(v, i + 1); return null; @@ -490,7 +490,7 @@ static class RSeq extends ASeq implements IndexedSeq{ return v.nth(i); } - public Seqable more(){ + public ISeq rest(){ if(i > 0) return new APersistentVector.RSeq(v, i - 1); return null; diff --git a/src/jvm/clojure/lang/ASeq.java b/src/jvm/clojure/lang/ASeq.java index f658ee91..29cc61d4 100644 --- a/src/jvm/clojure/lang/ASeq.java +++ b/src/jvm/clojure/lang/ASeq.java @@ -110,12 +110,19 @@ public ISeq cons(Object o){ return new Cons(o, this);
}
-final public ISeq rest(){
- Seqable m = more();
- if(m == null)
- return null;
- return m.seq();
-}
+public Seqable more(){
+ ISeq s = rest();
+ if(s == null)
+ return PersistentList.EMPTY;
+ return s;
+}
+
+//final public ISeq rest(){
+// Seqable m = more();
+// if(m == null)
+// return null;
+// return m.seq();
+//}
// java.util.Collection implementation
diff --git a/src/jvm/clojure/lang/ArraySeq.java b/src/jvm/clojure/lang/ArraySeq.java index f0d825a4..bbe3b199 100644 --- a/src/jvm/clojure/lang/ArraySeq.java +++ b/src/jvm/clojure/lang/ArraySeq.java @@ -65,7 +65,7 @@ public Object first(){ return Reflector.prepRet(Array.get(array, i)); } -public Seqable more(){ +public ISeq rest(){ if(oa != null) { if(i + 1 < oa.length) @@ -138,7 +138,7 @@ static public class ArraySeq_int extends ASeq implements IndexedSeq, IReduce{ return array[i]; } - public Seqable more(){ + public ISeq rest(){ if(i + 1 < array.length) return new ArraySeq_int(meta(), array, i + 1); return null; @@ -186,7 +186,7 @@ static public class ArraySeq_float extends ASeq implements IndexedSeq, IReduce{ return array[i]; } - public Seqable more(){ + public ISeq rest(){ if(i + 1 < array.length) return new ArraySeq_float(meta(), array, i + 1); return null; @@ -233,7 +233,7 @@ static public class ArraySeq_double extends ASeq implements IndexedSeq, IReduce{ return array[i]; } - public Seqable more(){ + public ISeq rest(){ if(i + 1 < array.length) return new ArraySeq_double(meta(), array, i + 1); return null; @@ -280,7 +280,7 @@ static public class ArraySeq_long extends ASeq implements IndexedSeq, IReduce{ return array[i]; } - public Seqable more(){ + public ISeq rest(){ if(i + 1 < array.length) return new ArraySeq_long(meta(), array, i + 1); return null; diff --git a/src/jvm/clojure/lang/Cons.java b/src/jvm/clojure/lang/Cons.java index a120aa19..3d2aef64 100644 --- a/src/jvm/clojure/lang/Cons.java +++ b/src/jvm/clojure/lang/Cons.java @@ -33,7 +33,13 @@ public Object first(){ return _first; } +public ISeq rest(){ + return more().seq(); +} + public Seqable more(){ + if(_more == null) + return PersistentList.EMPTY; return _more; } diff --git a/src/jvm/clojure/lang/EnumerationSeq.java b/src/jvm/clojure/lang/EnumerationSeq.java index 2cd7688c..7c579651 100644 --- a/src/jvm/clojure/lang/EnumerationSeq.java +++ b/src/jvm/clojure/lang/EnumerationSeq.java @@ -52,7 +52,7 @@ public Object first(){ return state.val; } -public Seqable more(){ +public ISeq rest(){ if(state._rest == state) synchronized(state) { diff --git a/src/jvm/clojure/lang/IteratorSeq.java b/src/jvm/clojure/lang/IteratorSeq.java index 6015428c..4a5ab80c 100644 --- a/src/jvm/clojure/lang/IteratorSeq.java +++ b/src/jvm/clojure/lang/IteratorSeq.java @@ -50,7 +50,7 @@ public Object first(){ return state.val;
}
-public Seqable more(){
+public ISeq rest(){
if(state._rest == state)
synchronized(state)
{
diff --git a/src/jvm/clojure/lang/LazyCons.java b/src/jvm/clojure/lang/LazyCons.java index 20daba01..ee60a891 100644 --- a/src/jvm/clojure/lang/LazyCons.java +++ b/src/jvm/clojure/lang/LazyCons.java @@ -49,7 +49,7 @@ public Object first(){ final synchronized -public Seqable more(){ +public ISeq rest(){ if(_rest == sentinel) { try diff --git a/src/jvm/clojure/lang/PersistentArrayMap.java b/src/jvm/clojure/lang/PersistentArrayMap.java index 6fa05319..d8fbd354 100644 --- a/src/jvm/clojure/lang/PersistentArrayMap.java +++ b/src/jvm/clojure/lang/PersistentArrayMap.java @@ -216,7 +216,7 @@ static class Seq extends ASeq{ return new MapEntry(array[i],array[i+1]);
}
- public Seqable more(){
+ public ISeq rest(){
if(i + 2 < array.length)
return new Seq(array, i + 2);
return null;
diff --git a/src/jvm/clojure/lang/PersistentHashMap.java b/src/jvm/clojure/lang/PersistentHashMap.java index f4c700e4..d696cd5a 100644 --- a/src/jvm/clojure/lang/PersistentHashMap.java +++ b/src/jvm/clojure/lang/PersistentHashMap.java @@ -349,7 +349,7 @@ final static class FullNode implements INode{ return s.first(); } - public Seqable more(){ + public ISeq rest(){ ISeq nexts = s.rest(); if(nexts != null) return new Seq(nexts, i, node); @@ -507,7 +507,7 @@ final static class BitmapIndexedNode implements INode{ return s.first(); } - public Seqable more(){ + public ISeq rest(){ ISeq nexts = s.rest(); if(nexts != null) return new Seq(nexts, i, node); diff --git a/src/jvm/clojure/lang/PersistentList.java b/src/jvm/clojure/lang/PersistentList.java index 26f7fea3..fabe5e1e 100644 --- a/src/jvm/clojure/lang/PersistentList.java +++ b/src/jvm/clojure/lang/PersistentList.java @@ -64,7 +64,7 @@ public Object first(){ return _first;
}
-public Seqable more(){
+public ISeq rest(){
if(_count == 1)
return null;
return (ISeq) _rest;
diff --git a/src/jvm/clojure/lang/PersistentQueue.java b/src/jvm/clojure/lang/PersistentQueue.java index f2205741..552cdb42 100644 --- a/src/jvm/clojure/lang/PersistentQueue.java +++ b/src/jvm/clojure/lang/PersistentQueue.java @@ -140,7 +140,7 @@ static class Seq extends ASeq{ return f.first();
}
- public Seqable more(){
+ public ISeq rest(){
ISeq f1 = f.rest();
ISeq r1 = rseq;
if(f1 == null)
diff --git a/src/jvm/clojure/lang/PersistentStructMap.java b/src/jvm/clojure/lang/PersistentStructMap.java index affad2fe..01e86346 100644 --- a/src/jvm/clojure/lang/PersistentStructMap.java +++ b/src/jvm/clojure/lang/PersistentStructMap.java @@ -216,7 +216,7 @@ static class Seq extends ASeq{ return new MapEntry(keys.first(), vals[i]); } - public Seqable more(){ + public ISeq rest(){ if(i + 1 < vals.length) return new Seq(_meta, keys.rest(), vals, i + 1, ext); return ext.seq(); diff --git a/src/jvm/clojure/lang/PersistentTreeMap.java b/src/jvm/clojure/lang/PersistentTreeMap.java index 035c01eb..1cd40969 100644 --- a/src/jvm/clojure/lang/PersistentTreeMap.java +++ b/src/jvm/clojure/lang/PersistentTreeMap.java @@ -781,7 +781,7 @@ static public class Seq extends ASeq{ return stack.first(); } - public Seqable more(){ + public ISeq rest(){ Node t = (Node) stack.first(); ISeq nextstack = push(asc ? t.right() : t.left(), stack.rest(), asc); if(nextstack != null) diff --git a/src/jvm/clojure/lang/RT.java b/src/jvm/clojure/lang/RT.java index 50a4baae..3a9b6c3b 100644 --- a/src/jvm/clojure/lang/RT.java +++ b/src/jvm/clojure/lang/RT.java @@ -585,7 +585,7 @@ static public Seqable more(Object x){ return ((ISeq) x).more(); ISeq seq = seq(x); if(seq == null) - return null; + return PersistentList.EMPTY; return seq.more(); } diff --git a/src/jvm/clojure/lang/Range.java b/src/jvm/clojure/lang/Range.java index 59d3dda3..226a77ba 100644 --- a/src/jvm/clojure/lang/Range.java +++ b/src/jvm/clojure/lang/Range.java @@ -39,7 +39,7 @@ public Object first(){ return n; } -public Seqable more(){ +public ISeq rest(){ if(n < end-1) return new Range(_meta, n + 1, end); return null; diff --git a/src/jvm/clojure/lang/StreamSeq.java b/src/jvm/clojure/lang/StreamSeq.java index dfc8cf63..44cfe28c 100644 --- a/src/jvm/clojure/lang/StreamSeq.java +++ b/src/jvm/clojure/lang/StreamSeq.java @@ -41,7 +41,7 @@ public class StreamSeq extends ASeq { return _first; } - synchronized public Seqable more() { + synchronized public ISeq rest() { if (stream != null) { try { _rest = create(stream); diff --git a/src/jvm/clojure/lang/StringSeq.java b/src/jvm/clojure/lang/StringSeq.java index f5800f45..cf370224 100644 --- a/src/jvm/clojure/lang/StringSeq.java +++ b/src/jvm/clojure/lang/StringSeq.java @@ -38,7 +38,7 @@ public Object first(){ return Character.valueOf(s.charAt(i)); } -public Seqable more(){ +public ISeq rest(){ if(i + 1 < s.length()) return new StringSeq(_meta, s, i + 1); return null; |