aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorŠtěpán Němec2020-04-12 00:27:51 +0200
committerŠtěpán Němec2020-08-25 17:59:05 +0200
commit0e01d5aa723cd50749f9028f0e8ad85a3afe52aa (patch)
treeec8f562e12be1dc70185801b34c1c373aeab9667
parentf3e29733bbe63950b3ef1259744723193ff5f388 (diff)
downloademacs-0e01d5aa723cd50749f9028f0e8ad85a3afe52aa.tar.gz
emacs-0e01d5aa723cd50749f9028f0e8ad85a3afe52aa.zip
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)
-rw-r--r--doc/lispref/variables.texi7
-rw-r--r--lisp/emacs-lisp/cl-lib.el7
-rw-r--r--lisp/emacs-lisp/gv.el18
3 files changed, 22 insertions, 10 deletions
diff --git a/doc/lispref/variables.texi b/doc/lispref/variables.texi
index abcd4bbd0f7..94c8c88796f 100644
--- a/doc/lispref/variables.texi
+++ b/doc/lispref/variables.texi
@@ -2585,8 +2585,11 @@ implemented this way:
2585 (macroexp-let2* nil ((start from) (end to)) 2585 (macroexp-let2* nil ((start from) (end to))
2586 (funcall do `(substring ,getter ,start ,end) 2586 (funcall do `(substring ,getter ,start ,end)
2587 (lambda (v) 2587 (lambda (v)
2588 (funcall setter `(cl--set-substring 2588 (macroexp-let2 nil v v
2589 ,getter ,start ,end ,v)))))))) 2589 `(progn
2590 ,(funcall setter `(cl--set-substring
2591 ,getter ,start ,end ,v))
2592 ,v))))))))
2590@end example 2593@end example
2591@end defmac 2594@end defmac
2592 2595
diff --git a/lisp/emacs-lisp/cl-lib.el b/lisp/emacs-lisp/cl-lib.el
index 7a26d9a90fd..7a4d3c9c3e3 100644
--- a/lisp/emacs-lisp/cl-lib.el
+++ b/lisp/emacs-lisp/cl-lib.el
@@ -619,8 +619,11 @@ If ALIST is non-nil, the new pairs are prepended to it."
619 (macroexp-let2* nil ((start from) (end to)) 619 (macroexp-let2* nil ((start from) (end to))
620 (funcall do `(substring ,getter ,start ,end) 620 (funcall do `(substring ,getter ,start ,end)
621 (lambda (v) 621 (lambda (v)
622 (funcall setter `(cl--set-substring 622 (macroexp-let2 nil v v
623 ,getter ,start ,end ,v)))))))) 623 `(progn
624 ,(funcall setter `(cl--set-substring
625 ,getter ,start ,end ,v))
626 ,v))))))))
624 627
625;;; Miscellaneous. 628;;; Miscellaneous.
626 629
diff --git a/lisp/emacs-lisp/gv.el b/lisp/emacs-lisp/gv.el
index 513bd328899..78d86b9fc31 100644
--- a/lisp/emacs-lisp/gv.el
+++ b/lisp/emacs-lisp/gv.el
@@ -527,9 +527,12 @@ This macro only makes sense when used in a place."
527 (gv-letplace (dgetter dsetter) d 527 (gv-letplace (dgetter dsetter) d
528 (funcall do 528 (funcall do
529 `(cons ,agetter ,dgetter) 529 `(cons ,agetter ,dgetter)
530 (lambda (v) `(progn 530 (lambda (v)
531 ,(funcall asetter `(car ,v)) 531 (macroexp-let2 nil v v
532 ,(funcall dsetter `(cdr ,v))))))))) 532 `(progn
533 ,(funcall asetter `(car ,v))
534 ,(funcall dsetter `(cdr ,v))
535 ,v))))))))
533 536
534(put 'logand 'gv-expander 537(put 'logand 'gv-expander
535 (lambda (do place &rest masks) 538 (lambda (do place &rest masks)
@@ -539,9 +542,12 @@ This macro only makes sense when used in a place."
539 (funcall 542 (funcall
540 do `(logand ,getter ,mask) 543 do `(logand ,getter ,mask)
541 (lambda (v) 544 (lambda (v)
542 (funcall setter 545 (macroexp-let2 nil v v
543 `(logior (logand ,v ,mask) 546 `(progn
544 (logand ,getter (lognot ,mask)))))))))) 547 ,(funcall setter
548 `(logior (logand ,v ,mask)
549 (logand ,getter (lognot ,mask))))
550 ,v))))))))
545 551
546;;; References 552;;; References
547 553