diff options
| author | Mattias EngdegÄrd | 2021-12-11 21:39:19 +0100 |
|---|---|---|
| committer | Mattias EngdegÄrd | 2021-12-20 16:26:02 +0100 |
| commit | 8706f6fde13729bf330693cfd163773583e526a9 (patch) | |
| tree | 16b7674aa4c7604d6b5b5f96a40e840ecc2fd1f0 /src/eval.c | |
| parent | 3259f399d46dabff5e0a87169d3d3455729d8681 (diff) | |
| download | emacs-8706f6fde13729bf330693cfd163773583e526a9.tar.gz emacs-8706f6fde13729bf330693cfd163773583e526a9.zip | |
Add `macroexp--dynamic-variable-p`
This predicate can be used for discriminating between lexically and
dynamically bound variables during macro-expansion (only).
It is restricted to internal use for the time being.
* lisp/emacs-lisp/bytecomp.el (byte-compile-initial-macro-environment):
Use macroexpand--all-toplevel.
* lisp/emacs-lisp/macroexp.el (macroexp-dynamic-variable-p): New.
(macroexp--expand-all): Maintain macroexp--dynvars.
(macroexpand-all): Rebind macroexp--dynvars.
(macroexpand--all-toplevel): New.
(internal-macroexpand-for-load): Use macroexpand--all-toplevel.
* src/eval.c (eval_sub): Transfer defvar declarations from
Vinternal_interpreter_environment into macroexp--dynvars during
lazy macro-expansion.
* src/lread.c (readevalloop): Rebind macroexp--dynvars around
read-and-evaluate operations.
(syms_of_lread): Define macroexp--dynvars.
* test/lisp/emacs-lisp/macroexp-resources/vk.el: New file.
* test/lisp/emacs-lisp/macroexp-tests.el (macroexp-tests--run-emacs)
(macroexp-tests--eval-in-subprocess)
(macroexp-tests--byte-compile-in-subprocess)
(macroexp--tests-dynamic-variable-p): Add tests.
Diffstat (limited to 'src/eval.c')
| -rw-r--r-- | src/eval.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/src/eval.c b/src/eval.c index fe29564aa2d..ddf455e4d78 100644 --- a/src/eval.c +++ b/src/eval.c | |||
| @@ -2608,6 +2608,19 @@ eval_sub (Lisp_Object form) | |||
| 2608 | interpreted using lexical-binding or not. */ | 2608 | interpreted using lexical-binding or not. */ |
| 2609 | specbind (Qlexical_binding, | 2609 | specbind (Qlexical_binding, |
| 2610 | NILP (Vinternal_interpreter_environment) ? Qnil : Qt); | 2610 | NILP (Vinternal_interpreter_environment) ? Qnil : Qt); |
| 2611 | |||
| 2612 | /* Make the macro aware of any defvar declarations in scope. */ | ||
| 2613 | Lisp_Object dynvars = Vmacroexp__dynvars; | ||
| 2614 | for (Lisp_Object p = Vinternal_interpreter_environment; | ||
| 2615 | !NILP (p); p = XCDR(p)) | ||
| 2616 | { | ||
| 2617 | Lisp_Object e = XCAR (p); | ||
| 2618 | if (SYMBOLP (e)) | ||
| 2619 | dynvars = Fcons(e, dynvars); | ||
| 2620 | } | ||
| 2621 | if (!EQ (dynvars, Vmacroexp__dynvars)) | ||
| 2622 | specbind (Qmacroexp__dynvars, dynvars); | ||
| 2623 | |||
| 2611 | exp = apply1 (Fcdr (fun), original_args); | 2624 | exp = apply1 (Fcdr (fun), original_args); |
| 2612 | exp = unbind_to (count1, exp); | 2625 | exp = unbind_to (count1, exp); |
| 2613 | val = eval_sub (exp); | 2626 | val = eval_sub (exp); |