elisp: Expansion

 
 13.2 Expansion of a Macro Call
 ==============================
 
 A macro call looks just like a function call in that it is a list which
 starts with the name of the macro.  The rest of the elements of the list
 are the arguments of the macro.
 
    Evaluation of the macro call begins like evaluation of a function
 call except for one crucial difference: the macro arguments are the
 actual expressions appearing in the macro call.  They are not evaluated
 before they are given to the macro definition.  By contrast, the
 arguments of a function are results of evaluating the elements of the
 function call list.
 
    Having obtained the arguments, Lisp invokes the macro definition just
 as a function is invoked.  The argument variables of the macro are bound
 to the argument values from the macro call, or to a list of them in the
 case of a ‘&rest’ argument.  And the macro body executes and returns its
 value just as a function body does.
 
    The second crucial difference between macros and functions is that
 the value returned by the macro body is an alternate Lisp expression,
 also known as the “expansion” of the macro.  The Lisp interpreter
 proceeds to evaluate the expansion as soon as it comes back from the
 macro.
 
    Since the expansion is evaluated in the normal manner, it may contain
 calls to other macros.  It may even be a call to the same macro, though
 this is unusual.
 
    Note that Emacs tries to expand macros when loading an uncompiled
 Lisp file.  This is not always possible, but if it is, it speeds up
 subsequent execution.  SeeHow Programs Do Loading.
 
    You can see the expansion of a given macro call by calling
 ‘macroexpand’.
 
  -- Function: macroexpand form &optional environment
      This function expands FORM, if it is a macro call.  If the result
      is another macro call, it is expanded in turn, until something
      which is not a macro call results.  That is the value returned by
      ‘macroexpand’.  If FORM is not a macro call to begin with, it is
      returned as given.
 
      Note that ‘macroexpand’ does not look at the subexpressions of FORM
      (although some macro definitions may do so).  Even if they are
      macro calls themselves, ‘macroexpand’ does not expand them.
 
      The function ‘macroexpand’ does not expand calls to inline
      functions.  Normally there is no need for that, since a call to an
      inline function is no harder to understand than a call to an
      ordinary function.
 
      If ENVIRONMENT is provided, it specifies an alist of macro
      definitions that shadow the currently defined macros.  Byte
      compilation uses this feature.
 
           (defmacro inc (var)
               (list 'setq var (list '1+ var)))
 
           (macroexpand '(inc r))
                ⇒ (setq r (1+ r))
 
           (defmacro inc2 (var1 var2)
               (list 'progn (list 'inc var1) (list 'inc var2)))
 
           (macroexpand '(inc2 r s))
                ⇒ (progn (inc r) (inc s))  ; ‘inc’ not expanded here.
 
  -- Function: macroexpand-all form &optional environment
      ‘macroexpand-all’ expands macros like ‘macroexpand’, but will look
      for and expand all macros in FORM, not just at the top-level.  If
      no macros are expanded, the return value is ‘eq’ to FORM.
 
      Repeating the example used for ‘macroexpand’ above with
      ‘macroexpand-all’, we see that ‘macroexpand-all’ _does_ expand the
      embedded calls to ‘inc’:
 
           (macroexpand-all '(inc2 r s))
                ⇒ (progn (setq r (1+ r)) (setq s (1+ s)))
 
  -- Function: macroexpand-1 form &optional environment
      This function expands macros like ‘macroexpand’, but it only
      performs one step of the expansion: if the result is another macro
      call, ‘macroexpand-1’ will not expand it.