Fall 2017


This course is not about programming. However, you will become a significantly better programmer for having completed it. The course introduces the issues surrounding the design and implementation of programming languages rather than their use. Mostly, we will use Racket to implement interpreters for a variety of languages (including various subsets of Racket itself). Because you will be writing interpreters that support various features of programming languages, you will come to intimately understand issues such as scope, lazy and eager evaluation, recursion, mutation, continuations, types, polymorphism, and much more.

As with most courses that are worth taking, this course requires your engagement with and participation in the learning process. Plan for it. This engagement will primarily take the form of reading about language issues that will be unfamiliar and abstract for most of you and working through examples and exercises. You anticipate reading the textbook; start your readings and assignments early. If you are unfamiliar with Racket, you may find the exercises challenging. I encourage you to spend the necessary effort during the first two weeks to become proficient with the Racket programming language. If you work the examples as you go through the text, your assignments will be manageable. You will typically be completing one programming assignment every other week.

Course Materials