diff options
author | Rich Hickey <richhickey@gmail.com> | 2007-09-07 17:39:32 +0000 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2007-09-07 17:39:32 +0000 |
commit | e50ef0f6ae3215545c0efd02a72a2793fdc67812 (patch) | |
tree | d759abeaf29cf9f79efe5fd419d8b5daf9916962 /src | |
parent | 2eb4e3d4f77718e04645eb59f629b31d9f85e166 (diff) |
added map expressions
Diffstat (limited to 'src')
-rw-r--r-- | src/jvm/clojure/lang/Compiler.java | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/src/jvm/clojure/lang/Compiler.java b/src/jvm/clojure/lang/Compiler.java index f0de498c..6d03e799 100644 --- a/src/jvm/clojure/lang/Compiler.java +++ b/src/jvm/clojure/lang/Compiler.java @@ -923,6 +923,41 @@ static String munge(String name){ return sb.toString(); } +static class MapExpr implements Expr{ + final IPersistentVector keyvals; + final static Method mapMethod = Method.getMethod("clojure.lang.IPersistentMap map(Object[])"); + + + public MapExpr(IPersistentVector keyvals){ + this.keyvals = keyvals; + } + + public Object eval() throws Exception{ + Object[] ret = new Object[keyvals.count()]; + for(int i = 0; i < keyvals.count(); i++) + ret[i] = ((Expr) keyvals.nth(i)).eval(); + return RT.map(ret); + } + + public void emit(C context, FnExpr fn, GeneratorAdapter gen){ + MethodExpr.emitArgsAsArray(keyvals, fn, gen); + gen.invokeStatic(RT_TYPE, mapMethod); + if(context == C.STATEMENT) + gen.pop(); + } + + public static Expr parse(C context, IPersistentMap form) throws Exception{ + IPersistentVector keyvals = PersistentVector.EMPTY; + for(ISeq s = RT.seq(form); s != null; s = s.rest()) + { + IMapEntry e = (IMapEntry) s.first(); + keyvals = (IPersistentVector) keyvals.cons(analyze(C.EXPRESSION, e.key())); + keyvals = (IPersistentVector) keyvals.cons(analyze(C.EXPRESSION, e.val())); + } + return new MapExpr(keyvals); + } +} + static class VectorExpr implements Expr{ final IPersistentVector args; final static Method vectorMethod = Method.getMethod("clojure.lang.IPersistentVector vector(Object[])"); @@ -1619,6 +1654,8 @@ private static Expr analyze(C context, Object form, String name) throws Exceptio return analyzeSeq(context, (ISeq) form, name); else if(form instanceof IPersistentVector) return VectorExpr.parse(context, (IPersistentVector) form); + else if(form instanceof IPersistentMap) + return MapExpr.parse(context, (IPersistentMap) form); // else throw new UnsupportedOperationException(); |