aboutsummaryrefslogtreecommitdiffstats
path: root/src/eval.c
diff options
context:
space:
mode:
authorMattias EngdegÄrd2021-12-11 21:39:19 +0100
committerMattias EngdegÄrd2021-12-20 16:26:02 +0100
commit8706f6fde13729bf330693cfd163773583e526a9 (patch)
tree16b7674aa4c7604d6b5b5f96a40e840ecc2fd1f0 /src/eval.c
parent3259f399d46dabff5e0a87169d3d3455729d8681 (diff)
downloademacs-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.c13
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);