diff options
author | Rich Hickey <richhickey@gmail.com> | 2010-06-10 07:55:57 -0400 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2010-06-10 07:55:57 -0400 |
commit | 0d7aed7deeebc3a540815eb245320597d129e2f2 (patch) | |
tree | a2a03f6af434d34a0311c06eb9f9ec3a2dd1a3c3 | |
parent | 662b38415e15edcbd720628c0c07a8f8817c96b4 (diff) |
add support for constant vectors and sets
-rw-r--r-- | src/jvm/clojure/lang/Compiler.java | 38 |
1 files changed, 36 insertions, 2 deletions
diff --git a/src/jvm/clojure/lang/Compiler.java b/src/jvm/clojure/lang/Compiler.java index ec1ec8c3..9659f322 100644 --- a/src/jvm/clojure/lang/Compiler.java +++ b/src/jvm/clojure/lang/Compiler.java @@ -2575,15 +2575,31 @@ public static class SetExpr implements Expr{ static public Expr parse(C context, IPersistentSet form) throws Exception{ IPersistentVector keys = PersistentVector.EMPTY; + boolean constant = true; + for(ISeq s = RT.seq(form); s != null; s = s.next()) { Object e = s.first(); - keys = (IPersistentVector) keys.cons(analyze(context == C.EVAL ? context : C.EXPRESSION, e)); + Expr expr = analyze(context == C.EVAL ? context : C.EXPRESSION, e); + keys = (IPersistentVector) keys.cons(expr); + if(!(expr instanceof LiteralExpr)) + constant = false; } Expr ret = new SetExpr(keys); if(form instanceof IObj && ((IObj) form).meta() != null) return new MetaExpr(ret, MapExpr .parse(context == C.EVAL ? context : C.EXPRESSION, ((IObj) form).meta())); + else if(constant) + { + IPersistentSet set = PersistentHashSet.EMPTY; + for(int i=0;i<keys.count();i++) + { + LiteralExpr ve = (LiteralExpr)keys.nth(i); + set = (IPersistentSet)set.cons(ve.val()); + } +// System.err.println("Constant: " + set); + return new ConstantExpr(set); + } else return ret; } @@ -2621,13 +2637,31 @@ public static class VectorExpr implements Expr{ } static public Expr parse(C context, IPersistentVector form) throws Exception{ + boolean constant = true; + IPersistentVector args = PersistentVector.EMPTY; for(int i = 0; i < form.count(); i++) - args = (IPersistentVector) args.cons(analyze(context == C.EVAL ? context : C.EXPRESSION, form.nth(i))); + { + Expr v = analyze(context == C.EVAL ? context : C.EXPRESSION, form.nth(i)); + args = (IPersistentVector) args.cons(v); + if(!(v instanceof LiteralExpr)) + constant = false; + } Expr ret = new VectorExpr(args); if(form instanceof IObj && ((IObj) form).meta() != null) return new MetaExpr(ret, MapExpr .parse(context == C.EVAL ? context : C.EXPRESSION, ((IObj) form).meta())); + else if (constant) + { + PersistentVector rv = PersistentVector.EMPTY; + for(int i =0;i<args.count();i++) + { + LiteralExpr ve = (LiteralExpr)args.nth(i); + rv = rv.cons(ve.val()); + } +// System.err.println("Constant: " + rv); + return new ConstantExpr(rv); + } else return ret; } |