]> git.eshelyaron.com Git - emacs.git/commitdiff
* lisp/emacs-lisp/macroexp.el (macroexp-let2*): Allow common shorthand
authorStefan Monnier <monnier@iro.umontreal.ca>
Mon, 11 Apr 2022 19:10:51 +0000 (15:10 -0400)
committerStefan Monnier <monnier@iro.umontreal.ca>
Mon, 11 Apr 2022 19:10:51 +0000 (15:10 -0400)
doc/lispref/variables.texi
etc/NEWS
lisp/emacs-lisp/macroexp.el

index f85ed847c47f29dc1be100c10fb2d2c824acaff6..f0e3f337a69d50165c237a167ce34e1ff44fd097 100644 (file)
@@ -2789,13 +2789,13 @@ implemented this way:
 (gv-define-expander substring
   (lambda (do place from &optional to)
     (gv-letplace (getter setter) place
-      (macroexp-let2* nil ((start from) (end to))
-        (funcall do `(substring ,getter ,start ,end)
+      (macroexp-let2* (from to)
+        (funcall do `(substring ,getter ,from ,to)
                  (lambda (v)
-                   (macroexp-let2 nil v v
+                   (macroexp-let2* (v)
                      `(progn
                         ,(funcall setter `(cl--set-substring
-                                           ,getter ,start ,end ,v))
+                                           ,getter ,from ,to ,v))
                         ,v))))))))
 @end example
 @end defmac
@@ -2808,7 +2808,7 @@ of Common Lisp could be implemented this way:
 @example
 (defmacro incf (place &optional n)
   (gv-letplace (getter setter) place
-    (macroexp-let2 nil v (or n 1)
+    (macroexp-let2* ((v (or n 1)))
       (funcall setter `(+ ,v ,getter)))))
 @end example
 
index 3c4dacf9124cc08547cf892fc24a66efeaf63ae3..79c27da5495ded6b47f14dde1b20dcaeeb6cdce2 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -1360,6 +1360,9 @@ functions.
 \f
 * Lisp Changes in Emacs 29.1
 
++++
+** 'macroexp-let2*' can omit 'test' arg and use single-var bindings.
+
 +++
 ** New variable 'last-event-device' and new function 'device-class'.
 On X Windows, 'last-event-device' specifies the input extension device
index e91b302af100203d5850b75fcf7b1b18e5e1e665..e4bc2df280365c7a0b4914db3daee3d1b63106ac 100644 (file)
@@ -567,12 +567,20 @@ cases where EXP is a constant."
 (defmacro macroexp-let2* (test bindings &rest body)
   "Multiple binding version of `macroexp-let2'.
 
-BINDINGS is a list of elements of the form (SYM EXP).  Each EXP
-can refer to symbols specified earlier in the binding list."
+BINDINGS is a list of elements of the form (SYM EXP) or just SYM,
+which then stands for (SYM SYM).
+Each EXP can refer to symbols specified earlier in the binding list.
+
+TEST has to be a symbol, and if it is nil it can be omitted."
   (declare (indent 2) (debug (sexp (&rest (sexp form)) body)))
+  (when (consp test) ;; `test' was omitted.
+    (push bindings body)
+    (setq bindings test)
+    (setq test nil))
   (pcase-exhaustive bindings
     ('nil (macroexp-progn body))
-    (`((,var ,exp) . ,tl)
+    (`(,(or `(,var ,exp) (and (pred symbolp) var (let exp var)))
+       . ,tl)
      `(macroexp-let2 ,test ,var ,exp
         (macroexp-let2* ,test ,tl ,@body)))))