diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2021-12-10 07:15:09 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2021-12-10 07:15:09 -0800 |
commit | e0814736ec16ca7712609b96558e4102883dda2a (patch) | |
tree | 7385715b480fa6ec4a1d6c099f6845de2da81a7e | |
parent | 1e4eadfd30f675f80e17e84682dfc88da6be9681 (diff) | |
download | txr-e0814736ec16ca7712609b96558e4102883dda2a.tar.gz txr-e0814736ec16ca7712609b96558e4102883dda2a.tar.bz2 txr-e0814736ec16ca7712609b96558e4102883dda2a.zip |
define-accessor: fix broken arg handling.
I discovered this off chance by searching for occurrences
of (let ,(zip ...) ...) or (let (,*(zip ...)) ...) in the
code base, noticing an incorrect one.
* stdlib/place.tl (sys:register-simple-accessor): Remove
spurious list around ,(zip temps args).
* tests/012/defset.tl: Test cases for define-accessor added.
-rw-r--r-- | stdlib/place.tl | 2 | ||||
-rw-r--r-- | tests/012/defset.tl | 12 |
2 files changed, 13 insertions, 1 deletions
diff --git a/stdlib/place.tl b/stdlib/place.tl index a08e320a..1ff5a0c1 100644 --- a/stdlib/place.tl +++ b/stdlib/place.tl @@ -931,7 +931,7 @@ (lambda (getter setter place body) (let* ((args (cdr place)) (temps (mapcar (ret (gensym)) args))) - ^(let (,(zip temps args)) + ^(let ,(zip temps args) (macrolet ((,getter () ^(,',get-fun ,*',temps)) (,setter (val) ^(,',set-fun ,*',temps ,val))) diff --git a/tests/012/defset.tl b/tests/012/defset.tl index 110f3c64..917c0a9c 100644 --- a/tests/012/defset.tl +++ b/tests/012/defset.tl @@ -19,3 +19,15 @@ (expand '(inc (foo 1 2 :a 3 :b 4) 5)) ^(let ((,%new-val-sym% (+ (foo 1 2 :a 3 :b 4) 5))) (bar 1 2 3 4 () 4 ,%new-val-sym%))) + +(defvarl %data% (vec 0 0 0 0 0 0 0 0 0 1)) +(defun getd (a b c) [%data% (+ a b c)]) +(defun setd (a b c v) (set [%data% (+ a b c)] v)) +(define-accessor getd setd) + +(mtest + (getd 2 3 4) 1 + (set (getd 2 3 4) 2) 2 + [%data% 9] 2 + (inc (getd 2 3 4) 3) 5 + [%data% 9] 5) |