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))
|
(macroexp-let2* nil ((start from) (end to))
|
||||||
(funcall do `(substring ,getter ,start ,end)
|
(funcall do `(substring ,getter ,start ,end)
|
||||||
(lambda (v)
|
(lambda (v)
|
||||||
(funcall setter `(cl--set-substring
|
(macroexp-let2 nil v v
|
||||||
,getter ,start ,end ,v))))))))
|
`(progn
|
||||||
|
,(funcall setter `(cl--set-substring
|
||||||
|
,getter ,start ,end ,v))
|
||||||
|
,v))))))))
|
||||||
@end example
|
@end example
|
||||||
@end defmac
|
@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))
|
(macroexp-let2* nil ((start from) (end to))
|
||||||
(funcall do `(substring ,getter ,start ,end)
|
(funcall do `(substring ,getter ,start ,end)
|
||||||
(lambda (v)
|
(lambda (v)
|
||||||
(funcall setter `(cl--set-substring
|
(macroexp-let2 nil v v
|
||||||
,getter ,start ,end ,v))))))))
|
`(progn
|
||||||
|
,(funcall setter `(cl--set-substring
|
||||||
|
,getter ,start ,end ,v))
|
||||||
|
,v))))))))
|
||||||
|
|
||||||
;;; Miscellaneous.
|
;;; Miscellaneous.
|
||||||
|
|
||||||
|
|
|
@ -527,9 +527,12 @@ This macro only makes sense when used in a place."
|
||||||
(gv-letplace (dgetter dsetter) d
|
(gv-letplace (dgetter dsetter) d
|
||||||
(funcall do
|
(funcall do
|
||||||
`(cons ,agetter ,dgetter)
|
`(cons ,agetter ,dgetter)
|
||||||
(lambda (v) `(progn
|
(lambda (v)
|
||||||
,(funcall asetter `(car ,v))
|
(macroexp-let2 nil v v
|
||||||
,(funcall dsetter `(cdr ,v)))))))))
|
`(progn
|
||||||
|
,(funcall asetter `(car ,v))
|
||||||
|
,(funcall dsetter `(cdr ,v))
|
||||||
|
,v))))))))
|
||||||
|
|
||||||
(put 'logand 'gv-expander
|
(put 'logand 'gv-expander
|
||||||
(lambda (do place &rest masks)
|
(lambda (do place &rest masks)
|
||||||
|
@ -539,9 +542,12 @@ This macro only makes sense when used in a place."
|
||||||
(funcall
|
(funcall
|
||||||
do `(logand ,getter ,mask)
|
do `(logand ,getter ,mask)
|
||||||
(lambda (v)
|
(lambda (v)
|
||||||
(funcall setter
|
(macroexp-let2 nil v v
|
||||||
`(logior (logand ,v ,mask)
|
`(progn
|
||||||
(logand ,getter (lognot ,mask))))))))))
|
,(funcall setter
|
||||||
|
`(logior (logand ,v ,mask)
|
||||||
|
(logand ,getter (lognot ,mask))))
|
||||||
|
,v))))))))
|
||||||
|
|
||||||
;;; References
|
;;; References
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue