diff options
author | Rich Hickey <richhickey@gmail.com> | 2008-05-14 18:37:04 +0000 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2008-05-14 18:37:04 +0000 |
commit | f0562071873fbd9f8654bbb6663ad8a1a34e0c65 (patch) | |
tree | c82dcffc9783a1c66d172b1a481bdb1943e32d88 | |
parent | 288d18fa2fdb293fde171a70e5cd8d63b8c30822 (diff) |
added LazilyPersistentVector
-rw-r--r-- | src/boot.clj | 13 | ||||
-rw-r--r-- | src/jvm/clojure/lang/AMapEntry.java | 4 | ||||
-rw-r--r-- | src/jvm/clojure/lang/APersistentVector.java | 12 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Agent.java | 2 | ||||
-rw-r--r-- | src/jvm/clojure/lang/LazilyPersistentVector.java | 75 | ||||
-rw-r--r-- | src/jvm/clojure/lang/LispReader.java | 2 | ||||
-rw-r--r-- | src/jvm/clojure/lang/RT.java | 3 |
7 files changed, 96 insertions, 15 deletions
diff --git a/src/boot.clj b/src/boot.clj index 90d702bd..3486d92a 100644 --- a/src/boot.clj +++ b/src/boot.clj @@ -214,7 +214,7 @@ "Creates a new vector containing the args." ([] []) ([& args] - (. clojure.lang.PersistentVector (create args)))) + (. clojure.lang.LazilyPersistentVector (create args)))) (defn hash-map "keyval => key val @@ -2386,13 +2386,20 @@ not-every? (comp not every?)) (take-while (bound-fn sc start-test start-key) (if ((bound-fn sc end-test end-key) e) s (rest s)))))) - (defn repeatedly "Takes a function of no args, presumably with side effects, and returns an infinite lazy sequence of calls to it" [f] (lazy-cons (f) (repeatedly f))) - (defn add-classpath "Adds the url (String or URL object) to the classpath per URLClassLoader.addURL" [url] (clojure.lang.RT.addURL url)) + +(defn vec + "Creates a new vector containing the contents of coll." + ([coll] + (. clojure.lang.LazilyPersistentVector (createOwning (to-array coll))))) + +(defn hash + "Returns the hash code of its argument" + [x] (. clojure.lang.Util (hash x)))
\ No newline at end of file diff --git a/src/jvm/clojure/lang/AMapEntry.java b/src/jvm/clojure/lang/AMapEntry.java index 395fb98a..ce4c219c 100644 --- a/src/jvm/clojure/lang/AMapEntry.java +++ b/src/jvm/clojure/lang/AMapEntry.java @@ -53,7 +53,7 @@ public Object nth(int i){ } private IPersistentVector asVector(){ - return PersistentVector.create(key(), val()); + return LazilyPersistentVector.createOwning(key(), val()); } public IPersistentVector assocN(int i, Object val){ @@ -97,7 +97,7 @@ public Object peek(){ } public IPersistentStack pop(){ - return PersistentVector.create(key()); + return LazilyPersistentVector.createOwning(key()); } public ISeq rseq() throws Exception{ diff --git a/src/jvm/clojure/lang/APersistentVector.java b/src/jvm/clojure/lang/APersistentVector.java index 242e11e6..ea018edd 100644 --- a/src/jvm/clojure/lang/APersistentVector.java +++ b/src/jvm/clojure/lang/APersistentVector.java @@ -253,7 +253,7 @@ static class Seq extends ASeq implements IndexedSeq{ public ISeq rest(){ if(i + 1 < v.count()) - return new PersistentVector.Seq(v, i + 1); + return new APersistentVector.Seq(v, i + 1); return null; } @@ -265,8 +265,8 @@ static class Seq extends ASeq implements IndexedSeq{ return v.count() - i; } - public PersistentVector.Seq withMeta(IPersistentMap meta){ - return new PersistentVector.Seq(meta, v, i); + public APersistentVector.Seq withMeta(IPersistentMap meta){ + return new APersistentVector.Seq(meta, v, i); } public Object reduce(IFn f) throws Exception{ @@ -305,7 +305,7 @@ static class RSeq extends ASeq implements IndexedSeq{ public ISeq rest(){ if(i > 0) - return new PersistentVector.RSeq(v, i - 1); + return new APersistentVector.RSeq(v, i - 1); return null; } @@ -317,8 +317,8 @@ static class RSeq extends ASeq implements IndexedSeq{ return i + 1; } - public PersistentVector.RSeq withMeta(IPersistentMap meta){ - return new PersistentVector.RSeq(meta, v, i); + public APersistentVector.RSeq withMeta(IPersistentMap meta){ + return new APersistentVector.RSeq(meta, v, i); } } diff --git a/src/jvm/clojure/lang/Agent.java b/src/jvm/clojure/lang/Agent.java index fe08edc9..5a07555c 100644 --- a/src/jvm/clojure/lang/Agent.java +++ b/src/jvm/clojure/lang/Agent.java @@ -26,7 +26,7 @@ final public static Executor pooledExecutor = final static Executor soloExecutor = Executors.newCachedThreadPool(); -final static ThreadLocal<PersistentVector> nested = new ThreadLocal<PersistentVector>(); +final static ThreadLocal<IPersistentVector> nested = new ThreadLocal<IPersistentVector>(); static class Action implements Runnable{ diff --git a/src/jvm/clojure/lang/LazilyPersistentVector.java b/src/jvm/clojure/lang/LazilyPersistentVector.java new file mode 100644 index 00000000..9c4c9a0a --- /dev/null +++ b/src/jvm/clojure/lang/LazilyPersistentVector.java @@ -0,0 +1,75 @@ +/** + * 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 May 14, 2008 */ + +package clojure.lang; + +import java.util.Collection; + +public class LazilyPersistentVector extends APersistentVector{ +final Object[] array; +PersistentVector v = null; + +static public IPersistentVector createOwning(Object... items){ + if(items.length == 0) + return PersistentVector.EMPTY; + return new LazilyPersistentVector(null, items, null); +} + +static public IPersistentVector create(Collection coll){ + return createOwning(coll.toArray()); +} + +LazilyPersistentVector(IPersistentMap meta, Object[] array, PersistentVector v){ + super(meta); + this.array = array; + this.v = v; +} + +public Object[] toArray(){ + return array; +} + +public Object nth(int i){ + return array[i]; +} + +public IPersistentVector assocN(int i, Object val){ + return (IPersistentVector) v().assoc(i, val); +} + +public int count(){ + return array.length; +} + +public IPersistentVector cons(Object o){ + return v().cons(o); +} + +public IPersistentStack pop(){ + return v().pop(); +} + +private synchronized IPersistentVector v(){ + if(v == null) + { + v = PersistentVector.create(array); + } + return v; +} + +public Obj withMeta(IPersistentMap meta){ + if(meta != _meta) + return new LazilyPersistentVector(meta, array, v); + return this; +} + +} diff --git a/src/jvm/clojure/lang/LispReader.java b/src/jvm/clojure/lang/LispReader.java index ed73d75f..d775ceca 100644 --- a/src/jvm/clojure/lang/LispReader.java +++ b/src/jvm/clojure/lang/LispReader.java @@ -764,7 +764,7 @@ static class ListReader extends AFn{ static class VectorReader extends AFn{
public Object invoke(Object reader, Object leftparen) throws Exception{
PushbackReader r = (PushbackReader) reader;
- return PersistentVector.create(readDelimitedList(']', r, true));
+ return LazilyPersistentVector.create(readDelimitedList(']', r, true));
}
}
diff --git a/src/jvm/clojure/lang/RT.java b/src/jvm/clojure/lang/RT.java index 4b00d928..fb46959e 100644 --- a/src/jvm/clojure/lang/RT.java +++ b/src/jvm/clojure/lang/RT.java @@ -23,7 +23,6 @@ import java.math.BigInteger; import java.security.AccessController; import java.security.PrivilegedAction; import java.net.URL; -import java.net.MalformedURLException; public class RT{ @@ -724,7 +723,7 @@ static public IPersistentSet set(Object... init){ } static public IPersistentVector vector(Object... init){ - return PersistentVector.create(init); + return LazilyPersistentVector.createOwning(init); } static public IPersistentVector subvec(IPersistentVector v, int start, int end){ |