X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/ab5796a9f97180707734a81320e3eb81937281fe..a85732e683f6e3b24426f36d4869135bad18d5af:/lispref/macros.texi diff --git a/lispref/macros.texi b/lispref/macros.texi index b28797b06c..0a1bf942c2 100644 --- a/lispref/macros.texi +++ b/lispref/macros.texi @@ -1,6 +1,6 @@ @c -*-texinfo-*- @c This is part of the GNU Emacs Lisp Reference Manual. -@c Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1998 Free Software Foundation, Inc. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1998, 2004 Free Software Foundation, Inc. @c See the file elisp.texi for copying conditions. @setfilename ../info/macros @node Macros, Customization, Functions, Top @@ -137,6 +137,25 @@ uses this feature. @end smallexample @end defun + +@defun macroexpand-all form &optional environment +@cindex macro expansion in entire form +@code{macroexpand-all} expands macros like @code{macroexpand}, but +will look for and expand all macros in @var{form}, not just at the +top-level. If no macros are expanded, the return value is @code{eq} +to @var{form}. + +Repeating the example used for @code{macroexpand} above with +@code{macroexpand-all}, we see that @code{macroexpand-all} @emph{does} +expand the embedded calls to @code{inc}: + +@smallexample +(macroexpand-all '(inc2 r s)) + @result{} (progn (setq r (1+ r)) (setq s (1+ s))) +@end smallexample + +@end defun + @node Compiling Macros @section Macros and Byte Compilation @cindex byte-compiling macros @@ -210,13 +229,14 @@ called interactively. which can specify how @key{TAB} should indent macro calls, and how to step through them for Edebug. -@defspec declare @var{specs}... -This special form is used at top level in a macro definition to -specify various additional information about it. Two kinds of -specification are currently supported: +@defmac declare @var{specs}@dots{} +@anchor{Definition of declare} +A @code{declare} form is used in a macro definition to specify various +additional information about it. Two kinds of specification are +currently supported: @table @code -@item (edebug @var{edebug-form-spec}) +@item (debug @var{edebug-form-spec}) Specify how to step through macro calls for Edebug. @xref{Instrumenting Macro Calls}, for more details. @@ -224,7 +244,17 @@ Specify how to step through macro calls for Edebug. Specify how to indent calls to this macro. @xref{Indenting Macros}, for more details. @end table -@end defspec + +A @code{declare} form only has its special effect in the body of a +@code{defmacro} form if it immediately follows the documentation +string, if present, or the argument list otherwise. (Strictly +speaking, @emph{several} @code{declare} forms can follow the +documentation string or argument list, but since a @code{declare} form +can have several @var{specs}, they can always be combined into a +single form.) When used at other places in a @code{defmacro} form, or +outside a @code{defmacro} form, @code{declare} just returns @code{nil} +without evaluating any @var{specs}. +@end defmac No macro absolutely needs a @code{declare} form, because that form has no effect on how the macro expands, on what the macro means in the @@ -356,9 +386,9 @@ trouble, and rules to follow to avoid trouble. @node Wrong Time @subsection Wrong Time - The most common problem in writing macros is doing too some of the + The most common problem in writing macros is doing some of the real work prematurely---while expanding the macro, rather than in the -expansion itself. For instance, one real package had this nmacro +expansion itself. For instance, one real package had this macro definition: @example @@ -415,7 +445,7 @@ For example, (for i from 1 to 10 do (print i))." (let ((i 1)) (while (<= i 3) (setq square (* i i)) - (princ (format "%d %d" i square)) + (princ (format "\n%d %d" i square)) (inc i))) @end group @group @@ -682,7 +712,7 @@ This is the same as no property---use the standard indentation pattern. @item @code{defun} Handle this function like a @samp{def} construct: treat the second line as the start of a @dfn{body}. -@item a number, @var{number} +@item an integer, @var{number} The first @var{number} arguments of the function are @dfn{distinguished} arguments; the rest are considered the body of the expression. A line in the expression is indented according to