From 0d7aed7deeebc3a540815eb245320597d129e2f2 Mon Sep 17 00:00:00 2001 From: Rich Hickey Date: Thu, 10 Jun 2010 07:55:57 -0400 Subject: [PATCH] add support for constant vectors and sets --- src/jvm/clojure/lang/Compiler.java | 38 ++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/src/jvm/clojure/lang/Compiler.java b/src/jvm/clojure/lang/Compiler.java index ec1ec8c30b..9659f322f1 100644 --- a/src/jvm/clojure/lang/Compiler.java +++ b/src/jvm/clojure/lang/Compiler.java @@ -2575,15 +2575,31 @@ public Class getJavaClass() throws Exception{ 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