Common Lisp the Language, 2nd Edition
Next: Environments
Up: Macros
Previous: Destructuring
X3J13 voted in June 1989 (DEFINE-COMPILER-MACRO) to add a facility for
defining compiler macros that take effect only when compiling
code, not when interpreting it.
The purpose of this facility is to permit selective source-code
transformations only when the compiler is processing the code. When the
compiler is about to compile a non-atomic form, it first calls
compiler-macroexpand-1
repeatedly until there is no more
expansion (there might not be any to begin with). Then it continues its
remaining processing, which may include calling
macroexpand-1
and so on.
The compiler is required to expand compiler macros. It is unspecified whether the interpreter does so. The intention is that only the compiler will do so, but the range of possible ``compiled-only’’ implementation strategies precludes any firm specification.
[Macro]
define-compiler-macro name lambda-list {declaration | doc-string}* {form}*
This is just like defmacro
except the definition is not
stored in the symbol function cell of name and is not seen by
macroexpand-1
. It is, however, seen by
compiler-macroexpand-1
. As with defmacro
, the
lambda-list may include &environment
and
&whole
and may include destructuring. The definition is
global. (There is no provision for defining local compiler macros in the
way that macrolet
defines local macros.)
A top-level call to define-compiler-macro
in a file
being compiled by compile-file
has an effect on the
compilation environment similar to that of a call to
defmacro
, except it is noticed as a compiler macro (see
section 25.1).
Note that compiler macro definitions do not appear in information
returned by function-information
; they are global, and
their interaction with other lexical and global definitions can be
reconstructed by compiler-macro-function
. It is up to
code-walking programs to decide whether to invoke compiler macro
expansion.
X3J13 voted in March 1988 (FLET-IMPLICIT-BLOCK) to specify that the
body of the expander function defined by defmacro
is
implicitly enclosed in a block
construct whose name is the
same as the name of the defined macro; presumably this applies
also to define-compiler-macro
. Therefore
return-from
may be used to exit from the function.
[Function]
compiler-macro-function
name
&optional
env
The name must be a symbol. If it has been defined as a
compiler macro, then compiler-macro-function
returns the
macro expansion function; otherwise it returns nil
. The
lexical environment env may override any global definition for
name by defining a local function or local macro (such as by
flet
, labels
, or macrolet
) in
which case nil
is returned.
setf
may be used with
compiler-macro-function
to install a function as the
expansion function for the compiler macro name, in the same
manner as for macro-function
. Storing the value
nil
removes any existing compiler macro definition. As with
macro-function
, a non-nil
stored value must be
a function of two arguments, the entire macro call and the environment.
The second argument to compiler-macro-function
must be
omitted when it is used with setf
.
[Function]
compiler-macroexpand
form
&optional
env
compiler-macroexpand-1
form
&optional
env
These are just like macroexpand
and
macroexpand-1
except that the expander function is obtained
as if by a call to compiler-macro-function
on the
car of the form rather than by a call to
macro-function
. Note that compiler-macroexpand
performs repeated expansion but compiler-macroexpand-1
performs at most one expansion. Two values are returned, the expansion
(or the original form) and a value that is true if any
expansion occurred and nil
otherwise.
There are three cases where no expansion happens:
notinline
declaration, either globally or in the lexical
environment env.flet
, labels
,
or macrolet
).Note that if there is no expansion, the original form is
returned as the first value, and nil
as the second
value.
Any macro expansion performed by the function
compiler-macroexpand
or by the function
compiler-macroexpand-1
is carried out by calling the
function that is the value of *macroexpand-hook*
.
A compiler macro may decline to provide any expansion merely by
returning the original form. This is useful when using the facility to
put ``compiler optimizers’’ on various function names. For example, here
is a compiler macro that ``optimizes’’ (one would hope) the
zero-argument and one-argument cases of a function called
plus
:
(define-compiler-macro plus (&whole form &rest args)
(case (length args)
(0 0)
(1 (car args))
(t form)))
Next: Environments
Up: Macros
Previous: Destructuring
AI.Repository@cs.cmu.edu