summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2007-12-17 01:51:42 +0000
committerRich Hickey <richhickey@gmail.com>2007-12-17 01:51:42 +0000
commita0d9ca6b9746767376ef8546889d7c44a9332ba5 (patch)
tree14d02164436e2572b77c2cff60f4b6af294b0fad /src
parentc0d142ca0b05be6249872c05fe1bff2fd948bd81 (diff)
made list return a PersistentList, not a seq
Diffstat (limited to 'src')
-rw-r--r--src/boot.clj2
-rw-r--r--src/jvm/clojure/lang/ASeq.java5
-rw-r--r--src/jvm/clojure/lang/PersistentList.java22
3 files changed, 25 insertions, 4 deletions
diff --git a/src/boot.clj b/src/boot.clj
index 94860790..bf986cb3 100644
--- a/src/boot.clj
+++ b/src/boot.clj
@@ -8,7 +8,7 @@
(in-namespace 'clojure)
-(def list (fn [& args] (if args args '())))
+(def list (. clojure.lang.PersistentList creator))
(def cons (fn [x seq] (. clojure.lang.RT (cons x seq))))
(def conj (fn [coll x] (. clojure.lang.RT (conj coll x))))
diff --git a/src/jvm/clojure/lang/ASeq.java b/src/jvm/clojure/lang/ASeq.java
index f3749eb1..67e2b778 100644
--- a/src/jvm/clojure/lang/ASeq.java
+++ b/src/jvm/clojure/lang/ASeq.java
@@ -63,7 +63,10 @@ public int hashCode(){
//}
public int count(){
- return 1 + RT.count(rest());
+ int i=1;
+ for(ISeq s = rest();s!=null;s = s.rest(),i++)
+ ;
+ return i;
}
public ISeq seq(){
diff --git a/src/jvm/clojure/lang/PersistentList.java b/src/jvm/clojure/lang/PersistentList.java
index ea724ffd..d31d3c57 100644
--- a/src/jvm/clojure/lang/PersistentList.java
+++ b/src/jvm/clojure/lang/PersistentList.java
@@ -12,6 +12,7 @@ package clojure.lang;
import java.util.List;
import java.util.ListIterator;
+import java.util.LinkedList;
public class PersistentList extends ASeq implements IPersistentList{
@@ -19,6 +20,23 @@ private final Object _first;
private final PersistentList _rest;
private final int _count;
+public static IFn creator = new RestFn(0){
+ protected Object doInvoke(Object args) throws Exception{
+ if(args instanceof ArraySeq)
+ {
+ Object[] argsarray = ((ArraySeq) args).array;
+ ISeq ret = EMPTY;
+ for(int i = argsarray.length - 1; i >= 0; --i)
+ ret = ret.cons(argsarray[i]);
+ return ret;
+ }
+ LinkedList list = new LinkedList();
+ for(ISeq s = RT.seq(args); s != null; s = s.rest())
+ list.add(s.first());
+ return create(list);
+ }
+};
+
final public static PersistentList EMPTY = new EmptyList(null);
public PersistentList(Object first){
@@ -66,7 +84,7 @@ public int count(){
return _count;
}
-public ISeq cons(Object o){
+public PersistentList cons(Object o){
return new PersistentList(meta(), o, this, _count + 1);
}
@@ -82,7 +100,7 @@ static class EmptyList extends PersistentList{
super(meta, null, null, 0);
}
- public ISeq cons(Object o){
+ public PersistentList cons(Object o){
return new PersistentList(meta(), o, null, 1);
}