Types and Programming Languages (updated code)