@Override public void compile(Obj args, CompiledCode code, VM vm, CompileEnv env) { // (let* ((x 1) (y 2)) body) checkArgsMin(args, 1); code.emitNewEnv(); env = CompileEnv.extendEnv(env); Obj o = args.first(); while (o != Symbol.NIL) { Symbol s; Obj val; if (o.first().isSymbol()) { s = o.first().asSymbol(); val = Symbol.NIL; } else { s = o.first().first().asSymbol(); val = o.first().second(); } Compiler.compile(val, code, vm, env); if (env.isSpecial(s)) { code.emitDBind(s); env.sbind(s); } else { code.emitBind(s); env.bind(s); } o = o.rest(); } Compiler.compileProgn(args.rest(), code, vm, env); code.emitPopEnv(); }