The goal of this course is to help students:
1. learn new languages quickly, 2. evaluate various languages and pick the most suitable one for a given task, 3. know when and how to design a little language, and 4. understand the effects of languages on thought and communication. We will study programming language concepts, not as paradigms but as a set of basic building blocks, by 1) implementing interpreters for the concepts using the Scala programming language and 2) rigorously discussing the concepts using the operational semantics.