37
Lisp implementers, like implementers of any language, have many ways they can implement an evaluator, ranging from a 'pure' interpreter that interprets the objects given to the evaluator directly to a compiler that translates the objects into machine code that it then runs. In the middle are implementations that compile the input into an intermediate form such as bytecodes for a virtual machine and then interprets the bytecodes. Most Common Lisp implementations these days use some form of compilation even when evaluating code at run time.
38
Sometimes the phrase
39
Not all Lisp objects can be written out in a way that can be read back in. But anything you can READ
can be printed back out 'readably' with PRINT
.
40
The empty list, ()
, which can also be written NIL
, is both an atom and a list.
41
In fact, as you'll see later, names aren't intrinsically tied to any one kind of thing. You can use the same name, depending on context, to refer to both a variable and a function, not to mention several other possibilities.
42
The case-converting behavior of the reader can, in fact, be customized, but understanding when and how to change it requires a much deeper discussion of the relation between names, symbols, and other program elements than I'm ready to get into just yet.
43
I'll discuss the relation between symbols and packages in more detail in Chapter 21.
44
Of course, other levels of correctness exist in Lisp, as in other languages. For instance, the s-expression that results from reading (foo 1 2)
is syntactically well-formed but can be evaluated only if foo
is the name of a function or macro.
45
One other rarely used kind of Lisp form is a list whose first element is a
46
One other possibility exists—it's possible to define
47
In Common Lisp a symbol can name both an operator—function, macro, or special operator—and a variable. This is one of the major differences between Common Lisp and Scheme. The difference is sometimes described as Common Lisp being a Lisp-2 vs. Scheme being a Lisp-1—a Lisp-2 has two namespaces, one for operators and one for variables, but a Lisp-1 uses a single namespace. Both choices have advantages, and partisans can debate endlessly which is better.
48
The others provide useful, but somewhat esoteric, features. I'll discuss them as the features they support come up.
49