When we got done talking, it occurred to me that let's are only allowed within expression sequences, i.e., expression lists enclosed in parens. These sequences have their own scopes and so their own symbol tables. What this means for the interp is that when you run an expr seq, in doExprSeq, you need to descend into its symbol table. I updated the type checker to save a pointer to the symbol table in the expr list tree. So, you need to modify the current interp code for doExprSeq by putting the following at the beginning: PushSymtab(); MoveToSymtab(t->components.exprlist.symtab; and the following at the end, before returning the value: PopSymtab();