summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/clj/clojure/core.clj4
-rw-r--r--src/clj/clojure/gvec.clj7
-rw-r--r--src/jvm/clojure/lang/APersistentVector.java6
-rw-r--r--src/jvm/clojure/lang/ArrayChunk.java6
-rw-r--r--src/jvm/clojure/lang/Indexed.java2
-rw-r--r--src/jvm/clojure/lang/PersistentVector.java12
-rw-r--r--src/jvm/clojure/lang/RT.java36
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();