This is an introduction to the Scheme programming language. It is intended as a quick-start guide, something a novice can use to get a non-trivial working knowledge of the language, before moving on to more comprehensive and in-depth texts.

The text describes an approach to writing a crisp and utilitarian Scheme. Although we will not cover Scheme from abs to zero?, we will not shy away from those aspects of the language that are difficult, messy, nonstandard, or unusual, but nevertheless useful and usable. Such aspects include call‑with‑current‑continuation, system interface, and dialect diversity. Our discussions will be informed by our focus on problem-solving, not by a quest for metalinguistic insight. I have therefore left out many of the staples of traditional Scheme tutorials. There will be no in-depth pedagogy; no dwelling on the semantic appeal of Scheme; no metacircular interpreters; no discussion of the underlying implementation; and no evangelizing about Scheme’s virtues. This is not to suggest that these things are unimportant. However, they are arguably not immediately relevant to someone seeking a quick introduction.

How quick though? I do not know if one can teach oneself Scheme in 21 days1, although I have heard it said that the rudiments of Scheme should be a matter of an afternoon’s study. The Scheme standard [23] itself, for all its exacting comprehensiveness, is a mere fifty pages long. It may well be that the insight, when it comes, will arrive in its entirety in one afternoon, though there is no telling how many afternoons of mistries must precede it. Until that zen moment, here is my gentle introduction.

Acknowledgment. I thank Matthias Felleisen for introducing me to Scheme and higher-order programming; and Matthew Flatt for creating the robust and pleasant MzScheme implementation used throughout this book.


1 A fixnum is a machine’s idea of a “small” integer. Every machine has its own idea of how big a fixnum can be.