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:
parent
f3e29733bb
commit
0e01d5aa72
3 changed files with 22 additions and 10 deletions
|
@ -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
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue