Along with TAPL, I like Essentials of Programming Languages. It's an introductory text going through a series of interpreters each adding new language features and covering alternative ways to implement things or accomplish a goal (an example, it covers various methods of parameter passing like pass by reference or value and so on).