branch: externals/compat
commit 9574eb1c940d0acb11fea82edfa61f05d270b05a
Author: Daniel Mendler <[email protected]>
Commit: Daniel Mendler <[email protected]>

    compat-29: Use simpler definition for while-let
---
 compat-29.el | 18 +++++++-----------
 1 file changed, 7 insertions(+), 11 deletions(-)

diff --git a/compat-29.el b/compat-29.el
index ff99e176ec..a92ce4e08d 100644
--- a/compat-29.el
+++ b/compat-29.el
@@ -321,17 +321,13 @@ If all bindings are non-nil, eval BODY and repeat.
 
 The variable list SPEC is the same as in `if-let'."
   (declare (indent 1) (debug if-let))
-  (let ((empty (make-symbol "s"))
-        (last t) list)
-    (dolist (var spec)
-      (push `(,(if (cdr var) (car var) empty)
-              (and ,last ,(if (cdr var) (cadr var) (car var))))
-            list)
-      (when (or (cdr var) (consp (car var)))
-        (setq last (caar list))))
-    `(while (let* ,(nreverse list)
-              (and ,(caar list)
-                   (progn ,(macroexp-progn (or body '(t))) t))))))
+  (let ((done (gensym "done")))
+    `(catch ',done
+       (while t
+         (if-let* ,spec
+             (progn
+               ,@body)
+           (throw ',done nil))))))
 
 ;;;; Defined in files.el
 

Reply via email to