[ < ] [ > ]   [ << ] [Plus haut] [ >> ]         [Top] [Table des matières] [Index] [ ? ]

13.4 Defining Macros

A Lisp macro is a list whose CAR is macro. Its CDR should be a function; expansion of the macro works by applying the function (with apply) to the list of unevaluated argument-expressions from the macro call.

It is possible to use an anonymous Lisp macro just like an anonymous function, but this is never done, because it does not make sense to pass an anonymous macro to functionals such as mapcar. In practice, all Lisp macros have names, and they are usually defined with the special form defmacro.

Special Form: defmacro name argument-list body-forms…

defmacro defines the symbol name as a macro that looks like this:

 
(macro lambda argument-list . body-forms)

(Note that the CDR of this list is a function—a lambda expression.) This macro object is stored in the function cell of name. The value returned by evaluating the defmacro form is name, but usually we ignore this value.

The shape and meaning of argument-list is the same as in a function, and the keywords &rest and &optional may be used (voir la section Other Features of Argument Lists). Macros may have a documentation string, but any interactive declaration is ignored since macros cannot be called interactively.

The body of the macro definition can include a declare form, which can specify how <TAB> should indent macro calls, and how to step through them for Edebug.

Macro: declare specs

A declare form is used in a macro definition to specify various additional information about it. Two kinds of specification are currently supported:

(debug edebug-form-spec)

Specify how to step through macro calls for Edebug. Voir la section Instrumenting Macro Calls.

(indent indent-spec)

Specify how to indent calls to this macro. Voir la section Indenting Macros, for more details.

A declare form only has its special effect in the body of a defmacro form if it immediately follows the documentation string, if present, or the argument list otherwise. (Strictly speaking, several declare forms can follow the documentation string or argument list, but since a declare form can have several specs, they can always be combined into a single form.) When used at other places in a defmacro form, or outside a defmacro form, declare just returns nil without evaluating any specs.

No macro absolutely needs a declare form, because that form has no effect on how the macro expands, on what the macro means in the program. It only affects secondary features: indentation and Edebug.


[ < ] [ > ]   [ << ] [Plus haut] [ >> ]         [Top] [Table des matières] [Index] [ ? ]

Ce document a été généré par Eric Reinbold le 13 Octobre 2007 en utilisant texi2html 1.78.