diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2015-11-25 06:29:43 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2015-11-25 06:29:43 -0800 |
commit | fd7e0a944b77d1cbba91e323cd0679bf0d00652b (patch) | |
tree | 1d1c3beea176c987eb8b2a6bbd0dbb6d1f545905 /share | |
parent | 49133d53e863ddfeeffcb46c7c20575f8c7910c5 (diff) | |
download | txr-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.tl | 19 |
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)) |