| 3692 | |
| 3693 | |
| 3694 | static public Expr parse(C context, IPersistentSet form) { |
| 3695 | IPersistentVector keys = PersistentVector.EMPTY; |
| 3696 | boolean constant = true; |
| 3697 | |
| 3698 | for(ISeq s = RT.seq(form); s != null; s = s.next()) |
| 3699 | { |
| 3700 | Object e = s.first(); |
| 3701 | Expr expr = analyze(context == C.EVAL ? context : C.EXPRESSION, e); |
| 3702 | keys = (IPersistentVector) keys.cons(expr); |
| 3703 | if(!(expr instanceof LiteralExpr)) |
| 3704 | constant = false; |
| 3705 | } |
| 3706 | Expr ret = new SetExpr(keys); |
| 3707 | if(form instanceof IObj && ((IObj) form).meta() != null) |
| 3708 | return new MetaExpr(ret, MapExpr |
| 3709 | .parse(context == C.EVAL ? context : C.EXPRESSION, ((IObj) form).meta())); |
| 3710 | else if(constant) |
| 3711 | { |
| 3712 | IPersistentSet set = PersistentHashSet.EMPTY; |
| 3713 | for(int i=0;i<keys.count();i++) |
| 3714 | { |
| 3715 | LiteralExpr ve = (LiteralExpr)keys.nth(i); |
| 3716 | set = (IPersistentSet)set.cons(ve.val()); |
| 3717 | } |
| 3718 | // System.err.println("Constant: " + set); |
| 3719 | return new ConstantExpr(set); |
| 3720 | } |
| 3721 | else |
| 3722 | return ret; |
| 3723 | } |
| 3724 | } |
| 3725 | |
| 3726 | public static class VectorExpr implements Expr{ |