(add-tests-with-string-output "set!" [(let ([x 12]) (set! x 13) x) => "13\n"] [(let ([x 12]) (set! x (fxadd1 x)) x) => "13\n"] [(let ([x 12]) (let ([x #f]) (set! x 14)) x) => "12\n"] [(let ([x 12]) (let ([y (let ([x #f]) (set! x 14))]) x)) => "12\n"] [(let ([f #f]) (let ([g (lambda () f)]) (set! f 10) (g))) => "10\n"] [(let ([f (lambda (x) (set! x (fxadd1 x)) x)]) (f 12)) => "13\n"] [(let ([x 10]) (let ([f (lambda (x) (set! x (fxadd1 x)) x)]) (cons x (f x)))) => "(10 . 11)\n"] [(let ([t #f]) (let ([locative (cons (lambda () t) (lambda (n) (set! t n)))]) ((cdr locative) 17) ((car locative)))) => "17\n"] [(let ([locative (let ([t #f]) (cons (lambda () t) (lambda (n) (set! t n))))]) ((cdr locative) 17) ((car locative))) => "17\n"] [(let ([make-counter (lambda () (let ([counter -1]) (lambda () (set! counter (fxadd1 counter)) counter)))]) (let ([c0 (make-counter)] [c1 (make-counter)]) (c0) (cons (c0) (c1)))) => "(1 . 0)\n"] [(let ([fact #f]) (set! fact (lambda (n) (if (fxzero? n) 1 (fx* n (fact (fxsub1 n)))))) (fact 5)) => "120\n"] [(let ([fact #f]) ((begin (set! fact (lambda (n) (if (fxzero? n) 1 (fx* n (fact (fxsub1 n)))))) fact) 5)) => "120\n"] )