summaryrefslogtreecommitdiffstats
path: root/share
diff options
context:
space:
mode:
Diffstat (limited to 'share')
-rw-r--r--share/txr/stdlib/place.tl18
1 files changed, 14 insertions, 4 deletions
diff --git a/share/txr/stdlib/place.tl b/share/txr/stdlib/place.tl
index 02a5c653..b22e4a16 100644
--- a/share/txr/stdlib/place.tl
+++ b/share/txr/stdlib/place.tl
@@ -132,7 +132,9 @@
(let ((pm-expander [*place-macro* (if (consp unex-place)
(car unex-place))]))
(when pm-expander
- (sys:setq place [pm-expander unex-place])))
+ (sys:setq place (sys:set-macro-ancestor
+ [pm-expander unex-place]
+ unex-place))))
(sys:setq place (macroexpand place env))
(when (or (eq place unex-place)
(null place)
@@ -143,20 +145,28 @@
(return place))
(sys:setq unex-place place))))
+ (defun sys:cp-origin (to-tree from-form . syms)
+ (tree-case to-tree
+ ((a . d) (when (memq a syms)
+ (sys:set-macro-ancestor to-tree from-form))
+ (sys:cp-origin a from-form . syms)
+ (sys:cp-origin d from-form . syms)))
+ to-tree)
+
(defun call-update-expander (getter setter unex-place env body)
(let* ((place (sys:pl-expand unex-place env))
(expander (get-update-expander place)))
- [expander getter setter place body]))
+ (sys:cp-origin [expander getter setter place body] place setter getter)))
(defun call-clobber-expander (ssetter unex-place env body)
(let* ((place (sys:pl-expand unex-place env))
(expander (get-clobber-expander place)))
- [expander ssetter place body]))
+ (sys:cp-origin [expander ssetter place body] place ssetter)))
(defun call-delete-expander (deleter unex-place env body)
(let* ((place (sys:pl-expand unex-place env))
(expander (get-delete-expander place)))
- [expander deleter place body])))
+ (sys:cp-origin [expander deleter place body] place deleter))))
(defmacro with-update-expander ((getter setter) unex-place env body)
^(with-gensyms (,getter ,setter)