emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master f559bd1248a: * lisp/emacs-lisp/cl-macs.el (cl--slet): Unbreak boo


From: Stefan Monnier
Subject: master f559bd1248a: * lisp/emacs-lisp/cl-macs.el (cl--slet): Unbreak bootstrap
Date: Sat, 24 Jun 2023 11:44:36 -0400 (EDT)

branch: master
commit f559bd1248a265662665c462b750eb5fc64dd811
Author: Stefan Monnier <monnier@iro.umontreal.ca>
Commit: Stefan Monnier <monnier@iro.umontreal.ca>

    * lisp/emacs-lisp/cl-macs.el (cl--slet): Unbreak bootstrap
---
 lisp/emacs-lisp/cl-macs.el | 25 ++++++++++++++-----------
 1 file changed, 14 insertions(+), 11 deletions(-)

diff --git a/lisp/emacs-lisp/cl-macs.el b/lisp/emacs-lisp/cl-macs.el
index 4caa573ea9d..540bcc7f3b3 100644
--- a/lisp/emacs-lisp/cl-macs.el
+++ b/lisp/emacs-lisp/cl-macs.el
@@ -245,17 +245,20 @@ The name is made by appending a number to PREFIX, default 
\"T\"."
 
 (defun cl--slet (bindings body)
   "Like `cl--slet*' but for \"parallel let\"."
-  (cond
-   ((seq-some (lambda (binding) (macroexp--dynamic-variable-p (car binding)))
-              bindings)
-    ;; FIXME: We use `identity' to obfuscate the code enough to
-    ;; circumvent the known bug in `macroexp--unfold-lambda' :-(
-    `(funcall (identity (lambda (,@(mapcar #'car bindings))
-                          ,@(macroexp-unprogn body)))
-              ,@(mapcar #'cadr bindings)))
-   ((null (cdr bindings))
-    (macroexp-let* bindings body))
-   (t `(let ,bindings ,@(macroexp-unprogn body)))))
+  (let ((dyn nil)) ;Is there a var declared as dynbound among the bindings?
+    ;; `seq-some' lead to bootstrap problems.
+    (dolist (binding bindings)
+      (if (macroexp--dynamic-variable-p (car binding)) (setq dyn t)))
+    (cond
+     (dyn
+      ;; FIXME: We use `identity' to obfuscate the code enough to
+      ;; circumvent the known bug in `macroexp--unfold-lambda' :-(
+      `(funcall (identity (lambda (,@(mapcar #'car bindings))
+                            ,@(macroexp-unprogn body)))
+                ,@(mapcar #'cadr bindings)))
+     ((null (cdr bindings))
+      (macroexp-let* bindings body))
+     (t `(let ,bindings ,@(macroexp-unprogn body))))))
 
 (defun cl--slet* (bindings body)
   "Like `macroexp-let*' but uses static scoping for all the BINDINGS."



reply via email to

[Prev in Thread] Current Thread [Next in Thread]