; a scheme idiom
(define (make-setter x)
(case-lambda
(() x)
((y) (set! x y) x)))
(define x (make-setter #f))
(display (x)) (newline)
(display (x "hello")) (newline)
(display (x)) (newline) (newline)
(define (make-accumulator n)
(case-lambda
(() n)
((m) (set! n (+ n m)) n)))
(define n (make-accumulator 10))
(display (n)) (newline)
(display (n 20)) (newline)
(display (n)) (newline) (newline)
(define (make-vector-setter vec)
(case-lambda
((idx) (vector-ref vec idx))
((idx val) (vector-set! vec idx val) vec)))
(define v (make-vector-setter (make-vector 3 #f)))
(display (v 0 "hello")) (newline)
(display (v 1 "goodbye")) (newline)
(display (v 2 "Scheme is fun!")) (newline)
(display (v 2)) (newline)
(display (v 0)) (newline)
(display (v 1)) (newline)