diff options
-rw-r--r-- | src/cli/runtime/RT.cs | 168 | ||||
-rw-r--r-- | src/jvm/clojure/lang/RT.java | 143 |
2 files changed, 254 insertions, 57 deletions
diff --git a/src/cli/runtime/RT.cs b/src/cli/runtime/RT.cs index eab52dfa..7b814154 100644 --- a/src/cli/runtime/RT.cs +++ b/src/cli/runtime/RT.cs @@ -81,17 +81,145 @@ static public int hashCombine(int seed, int hash){ return seed;
}
-static public ISeq seq(Object coll) {
- if(coll == null || coll is ISeq)
- return (ISeq) coll;
+static public ISeq seq(Object coll) {
+ if(coll == null)
+ return null;
else if(coll is IPersistentCollection)
return ((IPersistentCollection) coll).seq();
- else if(coll is IEnumerable)
- return EnumeratorSeq.create(((IEnumerable) coll).GetEnumerator());
+ else if (coll is IEnumerable)
+ return EnumeratorSeq.create(((IEnumerable)coll).GetEnumerator());
else if(coll is Object[])
return ArraySeq.create((Object[]) coll);
else
- throw new ArgumentException("Don't know how to create ISeq from arg");
+ throw new ArgumentException("Don't know how to create ISeq from arg");
+}
+
+static public Object meta(Object x)
+ {
+ if (x == null)
+ return null;
+ return ((Obj)x).meta();
+ }
+
+public static int count(Object o)
+ {
+ if (o == null)
+ return 0;
+ return ((IPersistentCollection)o).count();
+ }
+
+static public IPersistentCollection cons(Object x, IPersistentCollection y)
+ {
+ if (y == null)
+ return new PersistentList(x);
+ return y.cons(x);
+ }
+
+static public ISeq cons(Object x, ISeq y)
+ {
+ if (y == null)
+ return new PersistentList(x);
+ return (ISeq)y.cons(x);
+ }
+
+static public Object first(Object x)
+ {
+ if (x == null)
+ return null;
+ return seq(x).first();
+ }
+
+static public ISeq rest(Object x)
+ {
+ if (x == null)
+ return null;
+ return seq(x).rest();
+ }
+
+static public Object peek(Object x)
+ {
+ if (x == null)
+ return null;
+ return ((IPersistentList)x).peek();
+ }
+
+static public Object pop(Object x)
+ {
+ if (x == null)
+ return null;
+ return ((IPersistentList)x).pop();
+ }
+
+static public Object get(Object key, Object coll)
+ {
+ if (coll == null)
+ return null;
+ return ((Associative)coll).get(key);
+ }
+
+static public Object assoc(Object key, Object val, Object coll)
+ {
+ if (coll == null)
+ return new MapEntry(key, val);
+ return ((Associative)coll).assoc(key, val);
+ }
+
+static public Object contains(Object key, Object coll)
+ {
+ if (coll == null)
+ return false;
+ return ((Associative)coll).contains(key);
+ }
+
+static public Object find(Object key, Object coll)
+ {
+ if (coll == null)
+ return null;
+ return ((Associative)coll).find(key);
+ }
+
+static public Object without(Object key, Object coll)
+ {
+ if (coll == null)
+ return null;
+ return ((IPersistentMap)coll).without(key);
+ }
+
+static public Object nth(int n, Object coll) {
+ if(coll == null)
+ return null;
+ else if(coll is IPersistentArray)
+ return ((IPersistentArray)coll).nth(n);
+ else if(coll is Object[])
+ return ((Object[])coll)[n];
+ else if(coll is Sequential)
+ {
+ ISeq seq = ((IPersistentCollection) coll).seq();
+ for(int i=0;i<=n && seq != null;++i, seq = seq.rest())
+ {
+ if(i == n)
+ return seq.first();
+ }
+ return null;
+ }
+ else
+ return null;
+}
+
+static public Object assocN(int n, Object val, Object coll) {
+ if(coll == null)
+ return null;
+ else if(coll is IPersistentArray)
+ return ((IPersistentArray)coll).assocN(n,val);
+ else if(coll is Object[])
+ {
+ //hmm... this is not persistent
+ Object[] array = ((Object[])coll);
+ array[n] = val;
+ return array;
+ }
+ else
+ return null;
}
static public Iter iter(Object coll)
@@ -193,29 +321,6 @@ static public ISeq seq(Object coll) { return Convert.ToDouble(x);
}
-static public IPersistentCollection cons(Object x, IPersistentCollection y)
- {
- if (y == null)
- return new PersistentList(x);
- return y.cons(x);
- }
-
-static public ISeq cons(Object x, ISeq y)
- {
- if (y == null)
- return new PersistentList(x);
- return (ISeq)y.cons(x);
- }
-
-
-static public Object first(Object x) {
- return seq(x).first();
-}
-
-static public ISeq rest(Object x) {
- return seq(x).rest();
-}
-
static public ISeq list()
{
return null;
@@ -407,10 +512,5 @@ static public Object setValues(params Object[] vals) return null;
}
-public static int count(Object o) {
- if(o == null)
- return 0;
- return ((IPersistentCollection)o).count();
-}
}
}
\ No newline at end of file diff --git a/src/jvm/clojure/lang/RT.java b/src/jvm/clojure/lang/RT.java index 3263d923..1ab08253 100644 --- a/src/jvm/clojure/lang/RT.java +++ b/src/jvm/clojure/lang/RT.java @@ -68,6 +68,9 @@ static public boolean equal(Object k1,Object k2){ // ?Boolean.TRUE:null; // } + +////////////// Collections support ///////////////////////////////// + static public int hash(Object o){ if(o == null) return 0; @@ -81,8 +84,8 @@ static public int hashCombine(int seed, int hash){ } static public ISeq seq(Object coll) { - if(coll == null || coll instanceof ISeq) - return (ISeq) coll; + if(coll == null) + return null; else if(coll instanceof IPersistentCollection) return ((IPersistentCollection) coll).seq(); else if(coll instanceof Iterable) @@ -93,6 +96,121 @@ static public ISeq seq(Object coll) { throw new IllegalAccessError("Don't know how to create ISeq from arg"); } +static public Object meta(Object x) { + if(x == null) + return null; + return ((Obj)x).meta(); +} + +public static int count(Object o) { + if(o == null) + return 0; + return ((IPersistentCollection)o).count(); +} + +static public IPersistentCollection cons(Object x, IPersistentCollection y) { + if(y == null) + return new PersistentList(x); + return y.cons(x); +} + +static public ISeq cons(Object x, ISeq y) { + if(y == null) + return new PersistentList(x); + return y.cons(x); +} + +static public Object first(Object x) { + if(x == null) + return null; + return seq(x).first(); +} + +static public ISeq rest(Object x) { + if(x == null) + return null; + return seq(x).rest(); +} + +static public Object peek(Object x) { + if(x == null) + return null; + return ((IPersistentList)x).peek(); +} + +static public Object pop(Object x) { + if(x == null) + return null; + return ((IPersistentList)x).pop(); +} + +static public Object get(Object key, Object coll) { + if(coll == null) + return null; + return ((Associative)coll).get(key); +} + +static public Object assoc(Object key, Object val, Object coll) { + if(coll == null) + return new MapEntry(key,val); + return ((Associative)coll).assoc(key,val); +} + +static public Object contains(Object key, Object coll) { + if(coll == null) + return false; + return ((Associative)coll).contains(key); +} + +static public Object find(Object key, Object coll) { + if(coll == null) + return null; + return ((Associative)coll).find(key); +} + +static public Object without(Object key, Object coll) { + if(coll == null) + return null; + return ((IPersistentMap)coll).without(key); +} + +static public Object nth(int n, Object coll) { + if(coll == null) + return null; + else if(coll instanceof IPersistentArray) + return ((IPersistentArray)coll).nth(n); + else if(coll instanceof Object[]) + return ((Object[])coll)[n]; + else if(coll instanceof Sequential) + { + ISeq seq = ((IPersistentCollection) coll).seq(); + for(int i=0;i<=n && seq != null;++i, seq = seq.rest()) + { + if(i == n) + return seq.first(); + } + return null; + } + else + return null; +} + +static public Object assocN(int n, Object val, Object coll) { + if(coll == null) + return null; + else if(coll instanceof IPersistentArray) + return ((IPersistentArray)coll).assocN(n,val); + else if(coll instanceof Object[]) + { + //hmm... this is not persistent + Object[] array = ((Object[])coll); + array[n] = val; + return array; + } + else + return null; +} + static public Iter iter(Object coll) { if(coll == null || coll instanceof Iter) @@ -205,25 +323,9 @@ static public double doubleCast(Object x) /******************************************* list support ********************************/ -static public IPersistentCollection cons(Object x, IPersistentCollection y) { - if(y == null) - return new PersistentList(x); - return y.cons(x); -} -static public ISeq cons(Object x, ISeq y) { - if(y == null) - return new PersistentList(x); - return y.cons(x); -} -static public Object first(Object x) { - return seq(x).first(); -} -static public ISeq rest(Object x) { - return seq(x).rest(); -} static public ISeq list() { @@ -411,9 +513,4 @@ static public Object setValues(Object... vals) return null; } -public static int count(Object o) { - if(o == null) - return 0; - return ((IPersistentCollection)o).count(); -} } |