summaryrefslogtreecommitdiffstats
path: root/share
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2015-11-25 06:29:43 -0800
committerKaz Kylheku <kaz@kylheku.com>2015-11-25 06:29:43 -0800
commitfd7e0a944b77d1cbba91e323cd0679bf0d00652b (patch)
tree1d1c3beea176c987eb8b2a6bbd0dbb6d1f545905 /share
parent49133d53e863ddfeeffcb46c7c20575f8c7910c5 (diff)
downloadtxr-fd7e0a944b77d1cbba91e323cd0679bf0d00652b.tar.gz
txr-fd7e0a944b77d1cbba91e323cd0679bf0d00652b.tar.bz2
txr-fd7e0a944b77d1cbba91e323cd0679bf0d00652b.zip
New macro define-accessor.
* lisplib.c (place_set_entries): New entry to trigger autoloading for define-accessor. * share/txr/stdlib/place.tl (sys:register-simple-accessor): New function. (define-accessor): New macro. * txr.1: Documented define-accessor.
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))