diff options
| author | Štěpán Němec | 2020-04-12 00:27:51 +0200 |
|---|---|---|
| committer | Štěpán Němec | 2020-08-25 17:59:05 +0200 |
| commit | 0e01d5aa723cd50749f9028f0e8ad85a3afe52aa (patch) | |
| tree | ec8f562e12be1dc70185801b34c1c373aeab9667 | |
| parent | f3e29733bbe63950b3ef1259744723193ff5f388 (diff) | |
| download | emacs-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.texi | 7 | ||||
| -rw-r--r-- | lisp/emacs-lisp/cl-lib.el | 7 | ||||
| -rw-r--r-- | lisp/emacs-lisp/gv.el | 18 |
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 | ||