Correctly macroexpand top-level forms during eager macroexpand
* lisp/emacs-lisp/byte-run.el (eval-when-compile, eval-and-compile): Improve docstrings. * lisp/emacs-lisp/macroexp.el (internal-macroexpand-for-load): Add `full-p' parameter; when nil, call `macroexpand' instead of `macroexpand-all'. * src/lread.c (readevalloop_eager_expand_eval): New function that can recurse into toplevel forms. (readevalloop): Call it. * src/lisp.h: Declare Qprogn. * src/callint.c (Qprogn): No longer static. * test/automated/bytecomp-tests.el (test-byte-comp-compile-and-load): Add compile flag. (test-byte-comp-macro-expansion) (test-byte-comp-macro-expansion-eval-and-compile) (test-byte-comp-macro-expansion-eval-when-compile) (test-byte-comp-macro-expand-lexical-override): Use it. (test-eager-load-macro-expansion) (test-eager-load-macro-expansion-eval-and-compile) (test-eager-load-macro-expansion-eval-when-compile) (test-eager-load-macro-expand-lexical-override): New tests.
This commit is contained in:
parent
c98212f9e7
commit
12b1389c90
9 changed files with 118 additions and 19 deletions
|
@ -398,13 +398,20 @@ If you think you need this, you're probably making a mistake somewhere."
|
|||
|
||||
(defmacro eval-when-compile (&rest body)
|
||||
"Like `progn', but evaluates the body at compile time if you're compiling.
|
||||
Thus, the result of the body appears to the compiler as a quoted constant.
|
||||
In interpreted code, this is entirely equivalent to `progn'."
|
||||
Thus, the result of the body appears to the compiler as a quoted
|
||||
constant. In interpreted code, this is entirely equivalent to
|
||||
`progn', except that the value of the expression may be (but is
|
||||
not necessarily) computed at load time if eager macro expansion
|
||||
is enabled."
|
||||
(declare (debug (&rest def-form)) (indent 0))
|
||||
(list 'quote (eval (cons 'progn body) lexical-binding)))
|
||||
|
||||
(defmacro eval-and-compile (&rest body)
|
||||
"Like `progn', but evaluates the body at compile time and at load time."
|
||||
"Like `progn', but evaluates the body at compile time and at
|
||||
load time. In interpreted code, this is entirely equivalent to
|
||||
`progn', except that the value of the expression may be (but is
|
||||
not necessarily) computed at load time if eager macro expansion
|
||||
is enabled."
|
||||
(declare (debug t) (indent 0))
|
||||
;; When the byte-compiler expands code, this macro is not used, so we're
|
||||
;; either about to run `body' (plain interpretation) or we're doing eager
|
||||
|
|
|
@ -405,7 +405,7 @@ symbol itself."
|
|||
(defvar macroexp--pending-eager-loads nil
|
||||
"Stack of files currently undergoing eager macro-expansion.")
|
||||
|
||||
(defun internal-macroexpand-for-load (form)
|
||||
(defun internal-macroexpand-for-load (form full-p)
|
||||
;; Called from the eager-macroexpansion in readevalloop.
|
||||
(cond
|
||||
;; Don't repeat the same warning for every top-level element.
|
||||
|
@ -428,7 +428,9 @@ symbol itself."
|
|||
(condition-case err
|
||||
(let ((macroexp--pending-eager-loads
|
||||
(cons load-file-name macroexp--pending-eager-loads)))
|
||||
(macroexpand-all form))
|
||||
(if full-p
|
||||
(macroexpand-all form)
|
||||
(macroexpand form)))
|
||||
(error
|
||||
;; Hopefully this shouldn't happen thanks to the cycle detection,
|
||||
;; but in case it does happen, let's catch the error and give the
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue