Common Lisp the Language, 2nd Edition
Next: Macros
Up: Forms
Previous: Variables
If a list is to be evaluated as a form, the first step is to examine the first element of the list. If the first element is one of the symbols appearing in table 5-1, then the list is called a special form. (This use of the word ``special’’ is unrelated to its use in the phrase ``special variable.’’)
Special forms are generally environment and control constructs. Every
special form has its own idiosyncratic syntax. An example is the
if
special form: (if p (+ x 4) 5)
in Common
Lisp means what ``if p then
x+4 else 5’’ means in Algol.
The evaluation of a special form normally produces a value or values,
but the evaluation may instead call for a non-local exit; see
return-from
, go
, and throw
.
The set of special forms is fixed in Common Lisp; no way is provided for the user to define more. The user can create new syntactic constructs, however, by defining macros.
The set of special forms in Common Lisp is purposely kept very small
because any program-analyzing program must have special knowledge about
every type of special form. Such a program needs no special knowledge
about macros because it is simple to expand the macro and operate on the
resulting expansion. (This is not to say that many such programs,
particularly compilers, will not have such special knowledge. A compiler
may be able to produce much better code if it recognizes such constructs
as typecase
and multiple-value-bind
and gives
them customized treatment.)
An implementation is free to implement as a macro any construct
described herein as a special form. Conversely, an implementation is
free to implement as a special form any construct described herein as a
macro if an equivalent macro definition is also provided. The practical
consequence is that the predicates macro-function
and
special-form-p
may both be true of the same symbol. It is
recommended that a program-analyzing program process a form that is a
list whose car is a symbol as follows:
macro-function
is true of the symbol,
apply either macroexpand
or macroexpand-1
, as
appropriate, to the entire form and then start over.
Next: Macros
Up: Forms
Previous: Variables
AI.Repository@cs.cmu.edu