| 593 | } |
| 594 | |
| 595 | public static class AssignExpr implements Expr{ |
| 596 | public final AssignableExpr target; |
| 597 | public final Expr val; |
| 598 | |
| 599 | public AssignExpr(AssignableExpr target, Expr val){ |
| 600 | this.target = target; |
| 601 | this.val = val; |
| 602 | } |
| 603 | |
| 604 | public Object eval() { |
| 605 | return target.evalAssign(val); |
| 606 | } |
| 607 | |
| 608 | public void emit(C context, ObjExpr objx, GeneratorAdapter gen){ |
| 609 | target.emitAssign(context, objx, gen, val); |
| 610 | } |
| 611 | |
| 612 | public boolean hasJavaClass() { |
| 613 | return val.hasJavaClass(); |
| 614 | } |
| 615 | |
| 616 | public Class getJavaClass() { |
| 617 | return val.getJavaClass(); |
| 618 | } |
| 619 | |
| 620 | static class Parser implements IParser{ |
| 621 | public Expr parse(C context, Object frm) { |
| 622 | ISeq form = (ISeq) frm; |
| 623 | if(RT.length(form) != 3) |
| 624 | throw new IllegalArgumentException("Malformed assignment, expecting (set! target val)"); |
| 625 | Expr target = analyze(C.EXPRESSION, RT.second(form)); |
| 626 | if(!(target instanceof AssignableExpr)) |
| 627 | throw new IllegalArgumentException("Invalid assignment target"); |
| 628 | return new AssignExpr((AssignableExpr) target, analyze(C.EXPRESSION, RT.third(form))); |
| 629 | } |
| 630 | } |
| 631 | } |
| 632 | |
| 633 | public static class VarExpr implements Expr, AssignableExpr{ |
| 634 | public final Var var; |
nothing calls this directly
no outgoing calls
no test coverage detected