]> git.eshelyaron.com Git - emacs.git/commitdiff
* lisp/emacs-lisp/cl-macs.el (cl--slet): Unbreak bootstrap
authorStefan Monnier <monnier@iro.umontreal.ca>
Sat, 24 Jun 2023 15:44:32 +0000 (11:44 -0400)
committerStefan Monnier <monnier@iro.umontreal.ca>
Sat, 24 Jun 2023 15:44:32 +0000 (11:44 -0400)
lisp/emacs-lisp/cl-macs.el

index 4caa573ea9d44070fc9d48e4511a11130518154f..540bcc7f3b323224ecea9b87654def16967bc050 100644 (file)
@@ -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."