diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/boot.clj | 2 | ||||
-rw-r--r-- | src/jvm/clojure/lang/ASeq.java | 5 | ||||
-rw-r--r-- | src/jvm/clojure/lang/PersistentList.java | 22 |
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);
}
|