どこか間違っているかも知れないし、そうでなくても書き方がへぼいです。 そういうものとして読んでください。
fun interp(stm) = let datatype record = IntegerRecord of id * int fun interpStm(CompoundStm(s1, s2), tbl) = let val tbl1 = interpStm(s1, tbl) in interpStm(s2, tbl1) end | interpStm(AssignStm(id, exp), tbl) = let val (v, tbl1) = interpExp(exp, tbl) in IntegerRecord(id, v) :: tbl1 end | interpStm(PrintStm(l), tbl) = let val (v, tbl1) = interpExp(hd(l), tbl) val s = if (length l) > 1 then " " else "\n" in print (Int.toString v); print s; if length l > 1 then interpStm(PrintStm(List.drop(l, 1)), tbl1) else tbl end and interpExp(IdExp(id), tbl) = let fun lookup(id, tbl) = let val IntegerRecord(n, v) = hd(tbl) in if id = n then v else if length tbl > 1 then lookup(id, List.drop(tbl, 1)) else 0 end in (lookup(id, tbl), tbl) end | interpExp(NumExp(i), tbl) = (i, tbl) | interpExp(OpExp(lhs, Plus, rhs), tbl) = let val (lhs_value, tbl1) = interpExp(lhs, tbl) val (rhs_value, tbl2) = interpExp(rhs, tbl1) in (lhs_value + rhs_value, tbl2) end | interpExp(OpExp(lhs, Minus, rhs), tbl) = let val (lhs_value, tbl1) = interpExp(lhs, tbl) val (rhs_value, tbl2) = interpExp(rhs, tbl1) in (lhs_value - rhs_value, tbl2) end | interpExp(OpExp(lhs, Times, rhs), tbl) = let val (lhs_value, tbl1) = interpExp(lhs, tbl) val (rhs_value, tbl2) = interpExp(rhs, tbl1) in (lhs_value * rhs_value, tbl2) end | interpExp(OpExp(lhs, Div, rhs), tbl) = let val (lhs_value, tbl1) = interpExp(lhs, tbl) val (rhs_value, tbl2) = interpExp(rhs, tbl1) in (lhs_value div rhs_value, tbl2) end | interpExp(EseqExp(stm, exp), tbl) = let val tbl1 = interpStm(stm, tbl) in interpExp(exp, tbl1) end in interpStm(stm, []) end