From 7c4167b010e2edfed8dcf6e165bb37922df3fb29 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Mattias=20Engdeg=C3=A5rd?= Date: Fri, 7 Feb 2025 18:52:26 +0100 Subject: [PATCH] Make the rx `eval` form use lexical binding when active Previously, it always used dynamic binding. * lisp/emacs-lisp/rx.el (rx--expand-eval): Heed `lexical-binding`. * test/lisp/emacs-lisp/rx-tests.el (rx-tests--x, rx-tests--get-x) (rx-eval): Add test case. * etc/NEWS: Announce. (cherry picked from commit 89f88f06a4667a01612704e57f8af43ca19b82c0) --- lisp/emacs-lisp/rx.el | 2 +- test/lisp/emacs-lisp/rx-tests.el | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/lisp/emacs-lisp/rx.el b/lisp/emacs-lisp/rx.el index 8fbe35220f1..c512d42cd15 100644 --- a/lisp/emacs-lisp/rx.el +++ b/lisp/emacs-lisp/rx.el @@ -1072,7 +1072,7 @@ Return (REGEXP . PRECEDENCE)." "Expand `eval' arguments. Return a new rx form." (unless (and body (null (cdr body))) (error "rx `eval' form takes exactly one argument")) - (eval (car body))) + (eval (car body) lexical-binding)) (defun rx--translate-eval (body) "Translate the `eval' form. Return (REGEXP . PRECEDENCE)." diff --git a/test/lisp/emacs-lisp/rx-tests.el b/test/lisp/emacs-lisp/rx-tests.el index bd11be7bc72..a485b0f29e1 100644 --- a/test/lisp/emacs-lisp/rx-tests.el +++ b/test/lisp/emacs-lisp/rx-tests.el @@ -485,11 +485,18 @@ (should (equal (rx "" (regexp x) (eval "")) "a*")))) +(eval-when-compile + (defvar rx-tests--x "LEX") + (defun rx-tests--get-x () rx-tests--x)) + (ert-deftest rx-eval () (should (equal (rx (eval (list 'syntax 'symbol))) "\\s_")) (should (equal (rx "a" (eval (concat)) "b") - "ab"))) + "ab")) + (should (equal (rx (eval (funcall (lambda (rx-tests--x) (rx-tests--get-x)) + "DYN"))) + "LEX"))) (ert-deftest rx-literal () (should (equal (rx (literal "$a")) -- 2.39.5