summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2008-05-14 18:37:04 +0000
committerRich Hickey <richhickey@gmail.com>2008-05-14 18:37:04 +0000
commitf0562071873fbd9f8654bbb6663ad8a1a34e0c65 (patch)
treec82dcffc9783a1c66d172b1a481bdb1943e32d88
parent288d18fa2fdb293fde171a70e5cd8d63b8c30822 (diff)
added LazilyPersistentVector
-rw-r--r--src/boot.clj13
-rw-r--r--src/jvm/clojure/lang/AMapEntry.java4
-rw-r--r--src/jvm/clojure/lang/APersistentVector.java12
-rw-r--r--src/jvm/clojure/lang/Agent.java2
-rw-r--r--src/jvm/clojure/lang/LazilyPersistentVector.java75
-rw-r--r--src/jvm/clojure/lang/LispReader.java2
-rw-r--r--src/jvm/clojure/lang/RT.java3
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){