diff options
-rw-r--r-- | src/clj/clojure/core.clj | 4 | ||||
-rw-r--r-- | src/clj/clojure/gvec.clj | 7 | ||||
-rw-r--r-- | src/jvm/clojure/lang/APersistentVector.java | 6 | ||||
-rw-r--r-- | src/jvm/clojure/lang/ArrayChunk.java | 6 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Indexed.java | 2 | ||||
-rw-r--r-- | src/jvm/clojure/lang/PersistentVector.java | 12 | ||||
-rw-r--r-- | src/jvm/clojure/lang/RT.java | 36 |
7 files changed, 64 insertions, 9 deletions
diff --git a/src/clj/clojure/core.clj b/src/clj/clojure/core.clj index 1508a76c..a728bc0d 100644 --- a/src/clj/clojure/core.clj +++ b/src/clj/clojure/core.clj @@ -651,6 +651,8 @@ (defn count "Returns the number of items in the collection. (count nil) returns 0. Also works on strings, arrays, and Java Collections and Maps" + {:tag Integer + :inline (fn [x] `(. clojure.lang.RT (count ~x)))} [coll] (clojure.lang.RT/count coll)) (defn int @@ -1023,6 +1025,8 @@ (defn get "Returns the value mapped to key, not-found or nil if key not present." + {:inline (fn [m k & nf] `(. clojure.lang.RT (get ~m ~k ~@nf))) + :inline-arities #{2 3}} ([map key] (. clojure.lang.RT (get map key))) ([map key not-found] diff --git a/src/clj/clojure/gvec.clj b/src/clj/clojure/gvec.clj index dc1f0e79..f00de920 100644 --- a/src/clj/clojure/gvec.clj +++ b/src/clj/clojure/gvec.clj @@ -114,6 +114,11 @@ (nth [this i] (let [a (.arrayFor this i)] (.aget am a (bit-and i (int 0x1f))))) + (nth [this i not-found] + (let [z (int 0)] + (if (and (>= i z) (< i (.count this))) + (.nth this i) + not-found))) clojure.lang.IPersistentCollection (cons [this val] @@ -222,7 +227,7 @@ clojure.core.IVecImpl (tailoff [_] - (- cnt (alength tail))) + (- cnt (.alength am tail))) (arrayFor [this i] (if (and (<= (int 0) i) (< i cnt)) diff --git a/src/jvm/clojure/lang/APersistentVector.java b/src/jvm/clojure/lang/APersistentVector.java index 4fcde2d1..10023512 100644 --- a/src/jvm/clojure/lang/APersistentVector.java +++ b/src/jvm/clojure/lang/APersistentVector.java @@ -153,6 +153,12 @@ public Object get(int index){ return nth(index); } +public Object nth(int i, Object notFound){ + if(i >= 0 && i < count()) + return nth(i); + return notFound; +} + public Object remove(int i){ throw new UnsupportedOperationException(); } diff --git a/src/jvm/clojure/lang/ArrayChunk.java b/src/jvm/clojure/lang/ArrayChunk.java index d5a5a77b..e96b930b 100644 --- a/src/jvm/clojure/lang/ArrayChunk.java +++ b/src/jvm/clojure/lang/ArrayChunk.java @@ -36,6 +36,12 @@ public Object nth(int i){ return array[off + i]; } +public Object nth(int i, Object notFound){ + if(i >= 0 && i < count()) + return nth(i); + return notFound; +} + public int count(){ return end - off; } diff --git a/src/jvm/clojure/lang/Indexed.java b/src/jvm/clojure/lang/Indexed.java index 6f251377..2d678928 100644 --- a/src/jvm/clojure/lang/Indexed.java +++ b/src/jvm/clojure/lang/Indexed.java @@ -14,4 +14,6 @@ package clojure.lang; public interface Indexed extends Counted{ Object nth(int i); + +Object nth(int i, Object notFound); } diff --git a/src/jvm/clojure/lang/PersistentVector.java b/src/jvm/clojure/lang/PersistentVector.java index 878d5711..e93052e4 100644 --- a/src/jvm/clojure/lang/PersistentVector.java +++ b/src/jvm/clojure/lang/PersistentVector.java @@ -110,6 +110,12 @@ public Object nth(int i){ return node[i & 0x01f]; } +public Object nth(int i, Object notFound){ + if(i >= 0 && i < cnt) + return nth(i); + return notFound; +} + public PersistentVector assocN(int i, Object val){ if(i >= 0 && i < cnt) { @@ -542,6 +548,12 @@ static final class TransientVector extends AFn implements ITransientVector, Coun return node[i & 0x01f]; } + public Object nth(int i, Object notFound){ + if(i >= 0 && i < count()) + return nth(i); + return notFound; + } + public TransientVector assocN(int i, Object val){ ensureEditable(); if(i >= 0 && i < cnt) diff --git a/src/jvm/clojure/lang/RT.java b/src/jvm/clojure/lang/RT.java index 2dccffe3..57edb757 100644 --- a/src/jvm/clojure/lang/RT.java +++ b/src/jvm/clojure/lang/RT.java @@ -495,6 +495,10 @@ static public IPersistentMap meta(Object x){ public static int count(Object o){ if(o instanceof Counted) return ((Counted) o).count(); + return countFrom(o); +} + +static int countFrom(Object o){ if(o == null) return 0; else if(o instanceof IPersistentCollection) { @@ -605,10 +609,14 @@ static public Object pop(Object x){ } static public Object get(Object coll, Object key){ + if(coll instanceof ILookup) + return ((ILookup) coll).valAt(key); + return getFrom(coll, key); +} + +static Object getFrom(Object coll, Object key){ if(coll == null) return null; - else if(coll instanceof ILookup) - return ((ILookup) coll).valAt(key); else if(coll instanceof Map) { Map m = (Map) coll; return m.get(key); @@ -628,10 +636,14 @@ static public Object get(Object coll, Object key){ } static public Object get(Object coll, Object key, Object notFound){ + if(coll instanceof ILookup) + return ((ILookup) coll).valAt(key, notFound); + return getFrom(coll, key, notFound); +} + +static Object getFrom(Object coll, Object key, Object notFound){ if(coll == null) return notFound; - else if(coll instanceof ILookup) - return ((ILookup) coll).valAt(key, notFound); else if(coll instanceof Map) { Map m = (Map) coll; if(m.containsKey(key)) @@ -713,6 +725,10 @@ static public Object dissoc(Object coll, Object key) throws Exception{ static public Object nth(Object coll, int n){ if(coll instanceof Indexed) return ((Indexed) coll).nth(n); + return nthFrom(coll, n); +} + +static Object nthFrom(Object coll, int n){ if(coll == null) return null; else if(coll instanceof CharSequence) @@ -750,11 +766,13 @@ static public Object nth(Object coll, int n){ static public Object nth(Object coll, int n, Object notFound){ if(coll instanceof Indexed) { Indexed v = (Indexed) coll; - if(n >= 0 && n < v.count()) - return v.nth(n); - return notFound; + return v.nth(n, notFound); } - else if(coll == null) + return nthFrom(coll, n, notFound); +} + +static Object nthFrom(Object coll, int n, Object notFound){ + if(coll == null) return notFound; else if(n < 0) return notFound; @@ -900,6 +918,8 @@ static public short shortCast(Object x){ } static public int intCast(Object x){ + if(x instanceof Integer) + return ((Integer)x).intValue(); if(x instanceof Number) return intCast(((Number) x).longValue()); return ((Character) x).charValue(); |