summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2007-09-07 17:39:32 +0000
committerRich Hickey <richhickey@gmail.com>2007-09-07 17:39:32 +0000
commite50ef0f6ae3215545c0efd02a72a2793fdc67812 (patch)
treed759abeaf29cf9f79efe5fd419d8b5daf9916962 /src
parent2eb4e3d4f77718e04645eb59f629b31d9f85e166 (diff)
added map expressions
Diffstat (limited to 'src')
-rw-r--r--src/jvm/clojure/lang/Compiler.java37
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();