bug-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

bug#18821: 25.0.50; Let pp-macroexpand-expression expand only once


From: Stefan Monnier
Subject: bug#18821: 25.0.50; Let pp-macroexpand-expression expand only once
Date: Tue, 28 Oct 2014 13:00:09 -0400
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/25.0.50 (gnu/linux)

>     (defun macroexpand1 (expr)
>       (apply (cdr (symbol-function (car expr))) (cdr expr)))

Daniel Colascione already submitted a patch that provides
a macroexpand1.  And if that's not sufficient I also wrote my own.
The only reason I haven't installed it is because it would make a lot of
sense to reimplement `macroexpand' (in Elisp) on top of `macroexpand1',
but when I tried that, byte-compilation slowed down by about 5%, which
seemed excessive (especially since it reflects an even larger slowdown
of macroexpansion itself, tho I haven't measured that in more detail).


        Stefan


(defun macroexp-expand-1 (form environment)
  "Perform (at most) one step of macroexpansion."
  (cond
   ((consp form)
    (let* ((head (car form))
           (env-expander (assq head environment)))
      (if env-expander
          (if (cdr env-expander)
              (apply (cdr env-expander) (cdr form))
            form)
        (if (not (and (symbolp head) (fboundp head)))
            form
          (let ((def (autoload-do-load (symbol-function head) head 'macro)))
            (cond
             ;; Follow alias, but only for macros, otherwise we may end up
             ;; skipping an important compiler-macro (e.g. cl--block-wrapper).
             ((and (symbolp def) (macrop def)) (cons def (cdr form)))
             ((not (consp def)) form)
             (t
              (if (eq 'macro (car def))
                  (apply (cdr def) (cdr form))
                form))))))))
   (t form)))





reply via email to

[Prev in Thread] Current Thread [Next in Thread]