* lisp/emacs-lisp/macroexp.el (macroexp-let2*): Allow common shorthand
This commit is contained in:
parent
d6338f8a6a
commit
6a480c830b
3 changed files with 19 additions and 8 deletions
|
@ -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
|
||||
|
||||
|
|
3
etc/NEWS
3
etc/NEWS
|
@ -1360,6 +1360,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
|
||||
|
|
|
@ -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)))))
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue