A reductionist approach to a course on programming languages

The Programming Languages course is often a critical turning point in an undergraduate education where students begin to think more abstractly about programming languages and the design paradigms that use them. Traditional approaches to presenting this material often fail to achieve a number of important goals. We present an approach to Programming Languages that uses a single demonstration language (Scheme) and a collection of fundamental building blocks to study a variety of programming paradigms.