summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--share/txr/stdlib/place.tl37
1 files changed, 18 insertions, 19 deletions
diff --git a/share/txr/stdlib/place.tl b/share/txr/stdlib/place.tl
index ef1ec132..c2421c3c 100644
--- a/share/txr/stdlib/place.tl
+++ b/share/txr/stdlib/place.tl
@@ -657,21 +657,20 @@
(defplace (dwim obj-place index : (default nil have-default-p) :env env) body
(getter setter
(with-gensyms (ogetter-sym osetter-sym obj-sym
- oldval-sym newval-sym
- index-sym index-sym
- oldval-sym dflval-sym)
+ index-sym dflval-sym newval-sym)
(let ((sys:*lisp1* t))
(with-update-expander (ogetter-sym osetter-sym) obj-place nil
- ^(let ((,index-sym (sys:l1-val ,index))
- ,*(if have-default-p
- ^((,dflval-sym (sys:l1-val ,default)))))
+ ^(rlet ((,obj-sym (,ogetter-sym))
+ (,index-sym (sys:l1-val ,index))
+ ,*(if have-default-p
+ ^((,dflval-sym (sys:l1-val ,default)))))
(macrolet ((,getter ()
- '[(,ogetter-sym) ,index-sym
- ,*(if have-default-p ^(,dflval-sym))])
+ '[,obj-sym ,index-sym
+ ,*(if have-default-p ^(,dflval-sym))])
(,setter (val)
^(rlet ((,',newval-sym ,val))
(,',osetter-sym
- (sys:dwim-set (,',ogetter-sym)
+ (sys:dwim-set ,',obj-sym
,',index-sym ,',newval-sym))
,',newval-sym)))
,body))))))
@@ -681,10 +680,11 @@
(let ((sys:*lisp1* t))
(with-update-expander (ogetter-sym osetter-sym) obj-place nil
^(macrolet ((,ssetter (val)
- ^(rlet ((,',index-sym (sys:l1-val ,',index))
+ ^(rlet ((,',obj-sym (,',ogetter-sym))
+ (,',index-sym (sys:l1-val ,',index))
(,',newval-sym ,val))
(,',osetter-sym
- (sys:dwim-set (,',ogetter-sym)
+ (sys:dwim-set ,',obj-sym
,*(if ,have-default-p
^((prog1
,',index-sym
@@ -696,17 +696,16 @@
(deleter
(with-gensyms (osetter-sym ogetter-sym
- obj-sym index-sym oldval-sym
- dflval-sym)
+ obj-sym index-sym oldval-sym)
(let ((sys:*lisp1* t))
(with-update-expander (ogetter-sym osetter-sym) obj-place nil
^(macrolet ((,deleter () ;; todo: place must not have optional val
- ^(let ((,',obj-sym (,',ogetter-sym)))
- (let* ((,',index-sym (sys:l1-val ,',index))
- (,',oldval-sym [,',obj-sym
- ,',index-sym
- ,*(if ,have-default-p
- ^(,',default))]))
+ ^(rlet ((,',obj-sym (,',ogetter-sym))
+ (,',index-sym (sys:l1-val ,',index)))
+ (let ((,',oldval-sym [,',obj-sym
+ ,',index-sym
+ ,*(if ,have-default-p
+ ^(,',default))]))
(progn
(,',osetter-sym
(sys:dwim-del ,',obj-sym ,',index-sym))