This chapter introduces a basic interpreter that will serve as the foundation for most of this book. Deliberately simple, it's more closely related to Scheme than to Lisp, so we'll be able to explain Lisp in terms of Scheme that way. In this preliminary chapter, we'll broach a number of topics in succession: the articulations of this interpreter; the well known pair of functions, eval and apply; the qualities expected in environments and in functions. In short, we'll start various explorations here to pursue in later chapters, hoping that the intrepid reader will not be frightened away by the gaping abyss on either side of the trail.
The interpreter and its variations are written in native Scheme without any particular linguistic restrictions.
Literature about Lisp rarely resists that narcissistic pleasure of describing Lisp in Lisp. This habit began with the first reference manual for Lisp 1.5 [MAE+62] and has been widely imitated ever since. We'll mention only the following examples of that practice: (There are many others.) [Rib69], [Gre77], [Que82], [Cay83], [Cha80], [SJ93], [Rey72], [Gor75], [SS75], [A1178], [McC78b], [Lak80], [Hen80], [BM82], [Cli84], [FW84], [dRS84], [AS85], [R3R86], [Mas86], [Dyb87], [WH88], [Kes88], [LF88], [Dil88], [Kam90].
Those evaluators are quite varied, both in the languages that they define and in what they use to do so, but most of all in the goals they pursue. The evaluator defined in [Lak80], for example, shows how graphic objects and concepts can emerge naturally from Lisp, while the evaluator in [BM82] focuses on the size of evaluation.