(define (ex1 v1 v2) (let ([f (let ([memory 0]) (lambda (x) (set! memory (+ memory x)) memory))]) (f v1) (f v2))) (ex1 1 2) '= 3 (ex1 7 3) '= 10 (define (ex2 v1 v2) (let ([mk (let ([memory 0]) (lambda () (lambda (x) (set! memory (+ memory x)) memory)))]) (let ([f (mk)] [g (mk)]) (f v1) (g v2) (g 0)))) (ex2 1 2) '= 3 (ex2 7 3) '= 10 (define (ex3 v1 v2) (let ([mk (lambda () (let ([memory 0]) (lambda (x) (set! memory (+ memory x)) memory)))]) (let ([f (mk)] [g (mk)]) (f v1) (g v2) (g 0)))) (ex3 1 2) '= 2 (ex3 7 3) '= 3 (define (ex4 v1 v2 v3 v4) (let ([mk (let ([shared-memory 0]) (lambda () (let ([unshared-memory 0]) (lambda (a b) (set! unshared-memory (+ a unshared-memory)) (set! shared-memory (+ b shared-memory)) (+ unshared-memory shared-memory)))))]) (let ([f (mk)] [g (mk)]) (f v1 v2) (g v3 v4) (list (f 0 0) (g 0 0))))) (ex4 1 2 3 4) '= (list 7 9) (ex4 7 3 1 8) '= (list 18 12)