; 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)