#lang racket ; using closures to capture and hide state ; (hide-state) returns a closure that when invoked increments the ; previous stored value and then returns it. The initial value is 0. (define hide-state (lambda () (let ( (internal 0) ) ; internal is not visible outside of hide-state (lambda () (set! internal (+ internal 1)) internal) ) ) ) (display "hide-state")(newline) (define i (hide-state)) (i) (i) (i) ; (make-counter init incr) returns a list of 3 closures. ; the first returns the current value of the counter ; the second adds incr and returns the current value ; the third subtracts incr and returns the current value (define make-counter (lambda (init incr) (let ( (counter init) ) (list (lambda () counter) ; return the current value (lambda () (set! counter (+ counter incr)) counter) ; increment and return the current value (lambda () (set! counter (- counter incr)) counter) ; decrement and return the current value )))) (newline) (display "make-counter")(newline) (define counter (make-counter 5 3)) (define v (first counter)) (define v+ (second counter)) (define v- (third counter)) (v) (v+) (v) (v+) (v-) (v) (v-)