Preserve setf semantics in 'substring', 'cons', 'logand' expanders

* doc/lispref/variables.texi (Adding Generalized Variables): Fix example.
* lisp/emacs-lisp/cl-lib.el (substring)
* lisp/emacs-lisp/gv.el (cons, logand): Return the value being
assigned, as specified for 'setf'.  (bug#35546)
This commit is contained in:
Štěpán Němec 2020-04-12 00:27:51 +02:00
parent f3e29733bb
commit 0e01d5aa72
3 changed files with 22 additions and 10 deletions

View file

@ -2585,8 +2585,11 @@ implemented this way:
(macroexp-let2* nil ((start from) (end to))
(funcall do `(substring ,getter ,start ,end)
(lambda (v)
(funcall setter `(cl--set-substring
,getter ,start ,end ,v))))))))
(macroexp-let2 nil v v
`(progn
,(funcall setter `(cl--set-substring
,getter ,start ,end ,v))
,v))))))))
@end example
@end defmac

View file

@ -619,8 +619,11 @@ If ALIST is non-nil, the new pairs are prepended to it."
(macroexp-let2* nil ((start from) (end to))
(funcall do `(substring ,getter ,start ,end)
(lambda (v)
(funcall setter `(cl--set-substring
,getter ,start ,end ,v))))))))
(macroexp-let2 nil v v
`(progn
,(funcall setter `(cl--set-substring
,getter ,start ,end ,v))
,v))))))))
;;; Miscellaneous.

View file

@ -527,9 +527,12 @@ This macro only makes sense when used in a place."
(gv-letplace (dgetter dsetter) d
(funcall do
`(cons ,agetter ,dgetter)
(lambda (v) `(progn
,(funcall asetter `(car ,v))
,(funcall dsetter `(cdr ,v)))))))))
(lambda (v)
(macroexp-let2 nil v v
`(progn
,(funcall asetter `(car ,v))
,(funcall dsetter `(cdr ,v))
,v))))))))
(put 'logand 'gv-expander
(lambda (do place &rest masks)
@ -539,9 +542,12 @@ This macro only makes sense when used in a place."
(funcall
do `(logand ,getter ,mask)
(lambda (v)
(funcall setter
`(logior (logand ,v ,mask)
(logand ,getter (lognot ,mask))))))))))
(macroexp-let2 nil v v
`(progn
,(funcall setter
`(logior (logand ,v ,mask)
(logand ,getter (lognot ,mask))))
,v))))))))
;;; References