public SetAssign ( bool value ) : |
||
value | bool | |
return |
public Expr Parse(ParserContext pcon, object frm) { ISeq form = (ISeq)frm; // (if test then) or (if test then else) if (form.count() > 4) { throw new ParseException("Too many arguments to if"); } if (form.count() < 3) { throw new ParseException("Too few arguments to if"); } Expr testExpr = Compiler.Analyze(pcon.EvalOrExpr().SetAssign(false), RT.second(form)); Expr thenExpr = Compiler.Analyze(pcon.SetAssign(false), RT.third(form)); Expr elseExpr = Compiler.Analyze(pcon.SetAssign(false), RT.fourth(form)); return(new IfExpr((IPersistentMap)Compiler.SourceSpanVar.deref(), testExpr, thenExpr, elseExpr)); }
public Expr Parse(ParserContext pcon, object frm) { ISeq form = (ISeq)frm; if (pcon.Rhc != RHC.Return) return Compiler.Analyze(pcon, RT.list(RT.list(Compiler.FN, PersistentVector.EMPTY, form)), "try__" + RT.nextID()); // (try try-expr* catch-expr* finally-expr?) // catch-expr: (catch class sym expr*) // finally-expr: (finally expr*) IPersistentVector body = PersistentVector.EMPTY; IPersistentVector catches = PersistentVector.EMPTY; Expr bodyExpr = null; Expr finallyExpr = null; bool caught = false; int retLocal = Compiler.GetAndIncLocalNum(); int finallyLocal = Compiler.GetAndIncLocalNum(); for (ISeq fs = form.next(); fs != null; fs = fs.next()) { object f = fs.first(); object op = (f is ISeq) ? ((ISeq)f).first() : null; if (!Util.equals(op, Compiler.CATCH) && !Util.equals(op, Compiler.FINALLY)) { if (caught) throw new Exception("Only catch or finally clause can follow catch in try expression"); body = body.cons(f); } else { if (bodyExpr == null) bodyExpr = new BodyExpr.Parser().Parse(pcon.SetAssign(false),RT.seq(body)); if (Util.equals(op, Compiler.CATCH)) { Type t = HostExpr.MaybeType(RT.second(f), false); if (t == null) throw new ArgumentException("Unable to resolve classname: " + RT.second(f)); if (!(RT.third(f) is Symbol)) throw new ArgumentException("Bad binding form, expected symbol, got: " + RT.third(f)); Symbol sym = (Symbol)RT.third(f); if (sym.Namespace != null) throw new Exception("Can't bind qualified name: " + sym); IPersistentMap dynamicBindings = RT.map( Compiler.LOCAL_ENV, Compiler.LOCAL_ENV.deref(), Compiler.NEXT_LOCAL_NUM, Compiler.NEXT_LOCAL_NUM.deref(), Compiler.IN_CATCH_FINALLY, true); try { Var.pushThreadBindings(dynamicBindings); LocalBinding lb = Compiler.RegisterLocal(sym, (Symbol)(RT.second(f) is Symbol ? RT.second(f) : null), null,false); Expr handler = (new BodyExpr.Parser()).Parse(pcon.SetAssign(false), RT.next(RT.next(RT.next(f)))); catches = catches.cons(new CatchClause(t, lb, handler)); ; } finally { Var.popThreadBindings(); } caught = true; } else // finally { if (fs.next() != null) throw new Exception("finally clause must be last in try expression"); try { //Var.pushThreadBindings(RT.map(Compiler.IN_CATCH_FINALLY, RT.T)); Var.pushThreadBindings(RT.map(Compiler.IN_CATCH_FINALLY, true)); finallyExpr = (new BodyExpr.Parser()).Parse(pcon.SetRhc(RHC.Statement).SetAssign(false), RT.next(f)); } finally { Var.popThreadBindings(); } } } } if ( bodyExpr == null ) bodyExpr = (new BodyExpr.Parser()).Parse(pcon, RT.seq(body)); return new TryExpr(bodyExpr, catches, finallyExpr, retLocal, finallyLocal); }
public Expr Parse(ParserContext pcon, object frm) { ISeq form = (ISeq)frm; // (if test then) or (if test then else) if (form.count() > 4) throw new ParseException("Too many arguments to if"); if (form.count() < 3) throw new ParseException("Too few arguments to if"); Expr testExpr = Compiler.Analyze(pcon.EvalOrExpr().SetAssign(false),RT.second(form)); Expr thenExpr = Compiler.Analyze(pcon.SetAssign(false), RT.third(form)); Expr elseExpr = Compiler.Analyze(pcon.SetAssign(false), RT.fourth(form)); return new IfExpr((IPersistentMap)Compiler.SourceSpanVar.deref(), testExpr, thenExpr, elseExpr); }
public Expr Parse(ParserContext pcon, object frm) { ISeq form = (ISeq)frm; if (pcon.Rhc != RHC.Return) { return(Compiler.Analyze(pcon, RT.list(RT.list(Compiler.FnSym, PersistentVector.EMPTY, form)), "try__" + RT.nextID())); } // (try try-expr* catch-expr* finally-expr?) // catch-expr: (catch class sym expr*) // finally-expr: (finally expr*) IPersistentVector body = PersistentVector.EMPTY; IPersistentVector catches = PersistentVector.EMPTY; Expr bodyExpr = null; Expr finallyExpr = null; bool caught = false; //int retLocal = Compiler.GetAndIncLocalNum(); //int finallyLocal = Compiler.GetAndIncLocalNum(); for (ISeq fs = form.next(); fs != null; fs = fs.next()) { object f = fs.first(); ISeq fSeq = f as ISeq; object op = fSeq != null?fSeq.first() : null; if (!Util.equals(op, Compiler.CatchSym) && !Util.equals(op, Compiler.FinallySym)) { if (caught) { throw new ParseException("Only catch or finally clause can follow catch in try expression"); } body = body.cons(f); } else { if (bodyExpr == null) { try { Var.pushThreadBindings(RT.map(Compiler.NoRecurVar, true)); bodyExpr = new BodyExpr.Parser().Parse(pcon.SetAssign(false), RT.seq(body)); } finally { Var.popThreadBindings(); } } if (Util.equals(op, Compiler.CatchSym)) { Type t = HostExpr.MaybeType(RT.second(f), false); if (t == null) { throw new ParseException("Unable to resolve classname: " + RT.second(f)); } if (!(RT.third(f) is Symbol)) { throw new ParseException("Bad binding form, expected symbol, got: " + RT.third(f)); } Symbol sym = (Symbol)RT.third(f); if (sym.Namespace != null) { throw new ParseException("Can't bind qualified name: " + sym); } IPersistentMap dynamicBindings = RT.map( Compiler.LocalEnvVar, Compiler.LocalEnvVar.deref(), Compiler.NextLocalNumVar, Compiler.NextLocalNumVar.deref(), Compiler.InCatchFinallyVar, true); try { Var.pushThreadBindings(dynamicBindings); LocalBinding lb = Compiler.RegisterLocal(sym, (Symbol)(RT.second(f) is Symbol ? RT.second(f) : null), null, false); Expr handler = (new BodyExpr.Parser()).Parse(pcon.SetAssign(false), RT.next(RT.next(RT.next(f)))); catches = catches.cons(new CatchClause(t, lb, handler));; } finally { Var.popThreadBindings(); } caught = true; } else // finally { if (fs.next() != null) { throw new InvalidOperationException("finally clause must be last in try expression"); } try { //Var.pushThreadBindings(RT.map(Compiler.IN_CATCH_FINALLY, RT.T)); Var.pushThreadBindings(RT.map(Compiler.InCatchFinallyVar, true)); finallyExpr = (new BodyExpr.Parser()).Parse(pcon.SetRhc(RHC.Statement).SetAssign(false), RT.next(f)); } finally { Var.popThreadBindings(); } } } } if (bodyExpr == null) { try { Var.pushThreadBindings(RT.map(Compiler.NoRecurVar, true)); bodyExpr = (new BodyExpr.Parser()).Parse(pcon, RT.seq(body)); } finally { Var.popThreadBindings(); } } return(new TryExpr(bodyExpr, catches, finallyExpr /*, retLocal, finallyLocal*/)); }