This course is an introduction to the basic concepts of programming languages, with a strong emphasis on functional programming. The course intent is to teach enough about how any language “fits together” to make you more effective programming in any language — and in learning new ones. It will give you a framework for understanding how to use language constructs effectively and how to design correct and elegant programs. By using different languages, you will learn to think more deeply than in terms of the particular syntax of one language. The emphasis on functional programming is essential for learning how to write robust, reusable, compassable, and elegant programs. Indeed, many of the most important ideas in modern languages have their roots in functional programming.