mirror of
git://git.sv.gnu.org/emacs.git
synced 2025-12-06 14:30:50 -08:00
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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue