~ chicken-core (chicken-5) fad240593129b82ce3f8f3ad3382f1fcf3f32f55
commit fad240593129b82ce3f8f3ad3382f1fcf3f32f55
Author: felix <felix@call-with-current-continuation.org>
AuthorDate: Mon Nov 8 20:46:31 2010 +0100
Commit: felix <felix@call-with-current-continuation.org>
CommitDate: Mon Nov 8 20:46:31 2010 +0100
`getter-with-setter' was modifying the getter instead of creating a new
closure when the getter already had a setter slot - the bugger.
diff --git a/library.scm b/library.scm
index 8b3fe0e8..2be137a5 100644
--- a/library.scm
+++ b/library.scm
@@ -1980,6 +1980,8 @@ EOF
;;; Decorate procedure with arbitrary data
+;
+; warning: may modify proc, if it already has a suitable decoration!
(define (##sys#decorate-lambda proc pred decorator)
(let ((len (##sys#size proc)))
@@ -2078,7 +2080,7 @@ EOF
(##sys#make-lambda-info info))
(else (##sys#lambda-info get))))
(p1 (##sys#decorate-lambda
- get
+ (##sys#copy-closure get)
setter?
(lambda (proc i)
(##sys#setslot proc i (cons setter-tag set))
diff --git a/tests/library-tests.scm b/tests/library-tests.scm
index 69e21ec4..a41dc61f 100644
--- a/tests/library-tests.scm
+++ b/tests/library-tests.scm
@@ -146,3 +146,27 @@
(assert (equal? '#${ab c} '#${ab0c}))
(assert (equal? '#${abc} '#${ab0c}))
(assert (equal? '#${a b c} '#${0a0b0c}))
+
+
+;;; getter-with-setter
+
+(define foo
+ (let ((m 2))
+ (getter-with-setter
+ (lambda (x) (* x m))
+ (lambda (x)
+ (set! m x)))))
+
+(assert (= 6 (foo 3)))
+(set! (foo) 4)
+(assert (= 20 (foo 5)))
+
+(define bar
+ (getter-with-setter
+ foo
+ (lambda (x)
+ (+ x 99))))
+
+(assert (= 12 (bar 3)))
+(assert (= 100 (set! (bar) 1)))
+(assert (= 12 (foo 3)))
Trap