]> git.rkrishnan.org Git - sicp.git/blob - src/sicp/ex4_12.rkt
Solution to 4.30. Extremely enlightening!
[sicp.git] / src / sicp / ex4_12.rkt
1 #lang racket
2
3 ;; given a frame, get the value of a given variable
4 ;; false if not var is not found in the frame
5 (define (get-var-in-frame var frame)
6   ...)
7
8 ;; set a value for a given variable in a frame
9 ;; if frame already contain var, change its binding, else
10 ;; if frame does not have a binding for var, then create one.
11 (define (set-var-in-frame! var val frame)
12   ...)
13
14 ;; now using these two procedures, expressing `lookup-variable-value'
15 (define (lookup-variable-value var env)
16   (define (env-loop env)
17     (let ((frame (first-frame env)))
18       (let ((var-val (get-var-in-frame var frame)))
19         (if var-val
20             var-val
21             (env-loop (enclosing-environment env))))))
22   (if (eq? env the-empty-environment)
23       (error "Unbound variable" var)
24       (env-loop env)))
25
26
27 (define (set-variable-value! var val env)
28   (define (env-loop env)
29     (let ((frame (first-frame env)))
30       (let ((var-val (get-var-in-frame var frame)))
31         (if var-val
32             (set-var-in-frame! var val frame)
33             (env-loop (enclosing-environment env))))))
34   (if (eq? env the-empty-environment)
35       (error "Unbound variable -- SET!" var)
36       (env-loop env)))
37
38 (define (define-variable! var val env)
39   (let ((frame (first-frame env)))
40     (set-var-in-frame! var val frame)))