summaryrefslogtreecommitdiffstats
path: root/share
diff options
context:
space:
mode:
Diffstat (limited to 'share')
-rw-r--r--share/txr/stdlib/place.tl19
1 files changed, 19 insertions, 0 deletions
diff --git a/share/txr/stdlib/place.tl b/share/txr/stdlib/place.tl
index c60348e6..81a506a5 100644
--- a/share/txr/stdlib/place.tl
+++ b/share/txr/stdlib/place.tl
@@ -652,6 +652,25 @@
(symacrolet (,*(zip syms temps))
,*body)))))
+(defun sys:register-simple-accessor (get-fun set-fun)
+ (sethash *place-update-expander* get-fun
+ (lambda (getter setter place body)
+ (let* ((args (cdr place))
+ (temps (mapcar (ret (gensym)) args)))
+ ^(let (,(zip temps args))
+ (macrolet ((,getter () ^(,',get-fun ,*',temps))
+ (,setter (val)
+ ^(,',set-fun ,*',temps ,val)))
+ ,body)))))
+ (sethash *place-clobber-expander* get-fun
+ (lambda (ssetter place body)
+ ^(macrolet ((,ssetter (val)
+ ^(,',set-fun ,*(cdr ',place) ,val)))
+ ,body))))
+
+(defmacro define-accessor (get-fun set-fun)
+ ^(sys:register-simple-accessor ',get-fun ',set-fun))
+
(define-place-macro first (obj) ^(car ,obj))
(define-place-macro rest (obj) ^(cdr ,obj))
(define-place-macro second (obj) ^(ref ,obj 1))