[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bug#56739: 29.0.50; `cl-psetq' and `cl-psetf' fail to recognize symbol m
From: |
Michael Heerdegen |
Subject: |
bug#56739: 29.0.50; `cl-psetq' and `cl-psetf' fail to recognize symbol macros |
Date: |
Wed, 03 Aug 2022 02:20:55 +0200 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/29.0.50 (gnu/linux) |
Hello,
I think we can fix this (both cases mentioned) similarly as in cl-letf:
From 29ea21a751ab6e71b2fb34c781131e31fc7b950d Mon Sep 17 00:00:00 2001
From: Michael Heerdegen <michael_heerdegen@web.de>
Date: Wed, 3 Aug 2022 02:06:16 +0200
Subject: [PATCH] WIP: Fix symbol macros used in cl-psetf (Bug#56739)
---
lisp/emacs-lisp/cl-macs.el | 15 ++++++++++-----
1 file changed, 10 insertions(+), 5 deletions(-)
diff --git a/lisp/emacs-lisp/cl-macs.el b/lisp/emacs-lisp/cl-macs.el
index 78d19db479..f3051752ba 100644
--- a/lisp/emacs-lisp/cl-macs.el
+++ b/lisp/emacs-lisp/cl-macs.el
@@ -2653,12 +2653,17 @@ cl-psetf
\(fn PLACE VAL PLACE VAL ...)"
(declare (debug setf))
- (let ((p args) (simple t) (vars nil))
+ (let ((p args) (simple t) (vars nil)
+ (smacros (alist-get :cl-symbol-macros macroexpand-all-environment)))
(while p
- (if (or (not (symbolp (car p))) (cl--expr-depends-p (nth 1 p) vars))
- (setq simple nil))
- (if (memq (car p) vars)
- (error "Destination duplicated in psetf: %s" (car p)))
+ (when (or (not (symbolp (car p)))
+ (assq (car p) smacros)
+ (and (symbolp (nth 1 p))
+ (assq (nth 1 p) smacros))
+ (cl--expr-depends-p (nth 1 p) vars))
+ (setq simple nil))
+ (when (memq (car p) vars)
+ (error "Destination duplicated in psetf: %s" (car p)))
(push (pop p) vars)
(or p (error "Odd number of arguments to cl-psetf"))
(pop p))
--
2.30.2
But I'm not a fan of symbol macros any more: the concept sounds nice
first, but actually you only save one pair of parens when coding while
they introduce a special case that one always has too keep in mind for
macro expansions: any symbol might not just be a symbol.
I guess this is not the only place where they are not handled correctly.
Michael.