summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Monnier <monnier@iro.umontreal.ca>2022-04-11 15:10:51 -0400
committerStefan Monnier <monnier@iro.umontreal.ca>2022-04-11 15:10:51 -0400
commit6a480c830bc8d313ca3052570487a65411c937c2 (patch)
tree37fb9665e32576097d3c28ddea81af877924e9ee
parentd6338f8a6a5670d7d7075aa277896d9f74723c7a (diff)
downloademacs-6a480c830bc8d313ca3052570487a65411c937c2.tar.gz
* lisp/emacs-lisp/macroexp.el (macroexp-let2*): Allow common shorthand
-rw-r--r--doc/lispref/variables.texi10
-rw-r--r--etc/NEWS3
-rw-r--r--lisp/emacs-lisp/macroexp.el14
3 files changed, 19 insertions, 8 deletions
diff --git a/doc/lispref/variables.texi b/doc/lispref/variables.texi
index f85ed847c47..f0e3f337a69 100644
--- a/doc/lispref/variables.texi
+++ b/doc/lispref/variables.texi
@@ -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
diff --git a/etc/NEWS b/etc/NEWS
index 3c4dacf9124..79c27da5495 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -1361,6 +1361,9 @@ functions.
* 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
from which the last input event originated, and 'device-class' can be
diff --git a/lisp/emacs-lisp/macroexp.el b/lisp/emacs-lisp/macroexp.el
index e91b302af10..e4bc2df2803 100644
--- a/lisp/emacs-lisp/macroexp.el
+++ b/lisp/emacs-lisp/macroexp.el
@@ -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)))))