internal DynamicLet(Cons args,Env env,Interpreter interpreter,Loc loc) { this.loc = loc; this.interpreter = interpreter; Cons bindlist = (Cons)args.first; Int32 blen = Cons.Length(bindlist); if((blen%2) != 0) //odd { throw new Exception("Odd number of args in dynamic-let binding list"); } binds = new BindPair[blen/2]; for(int i = 0;i<binds.Length;i++) { binds[i].dvar = (DynamicVar)interpreter.analyze(bindlist.first, env,loc); bindlist = bindlist.rest; binds[i].expr = interpreter.analyze(bindlist.first, env,loc); bindlist = bindlist.rest; } this.body = interpreter.analyze(new Cons(interpreter.BLOCK,args.rest), env,loc); }
internal DynamicLet(Cons args,Env env,Interpreter interpreter,Loc loc) { this.loc = loc; this.interpreter = interpreter; Cons bindlist = (Cons)args.first; Int32 blen = Cons.Length(bindlist); if((blen%2) != 0) //odd { throw new Exception("Odd number of args in dynamic-let binding list"); } binds = new BindPair[blen/2]; for(int i = 0;i<binds.Length;i++) { // MEH: Better error instead of InvalidCastException //binds[i].dvar = (DynamicVar)interpreter.analyze(bindlist.first, env,loc); if((binds[i].dvar = (interpreter.analyze(bindlist.first, env,loc) as DynamicVar)) == null) throw new Exception("Dynamic vars must have prefix *"); bindlist = bindlist.rest; binds[i].expr = interpreter.analyze(bindlist.first, env,loc); bindlist = bindlist.rest; } this.body = interpreter.analyze(new Cons(interpreter.BLOCK,args.rest), env,loc); }