From 2c9ab2224560401993388d8b5551f76045a17d2f Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Fri, 10 Dec 2021 07:15:09 -0800 Subject: 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. --- stdlib/place.tl | 2 +- tests/012/defset.tl | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) 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) -- cgit v1.2.3