Chapter 5, Computing with Register Machines
Exercise 5.39
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
;;ex-5.39
;;note that i later changed this from cons to list ex-5.41
(define (make-lexical-address frame-num elem-num)
(cons frame-num elem-num))
(define (lex-addr-frame-num lexical-address)
(car lexical-address))
(define (lex-addr-displacement lexical-address)
(cdr lexical-address))
(define (lexical-address-lookup lex-addr env)
(let ((correct-env (env-ref env
(lex-addr-frame-num lex-addr))))
(let ((elem (list-ref (frame-values
(first-frame correct-env))
(lex-addr-displacement lex-addr))))
(if (eq? elem '*unassigned*)
(error "Error - Unassigned variable access!")
elem))))
(define (lexical-address-set! lex-addr val env)
(let ((correct-env (env-ref env
(lex-addr-frame-num lex-addr))))
(list-set! (frame-values
(first-frame correct-env))
(lex-addr-displacement lex-addr)
val)
'ok))
(define (env-ref env frame-num)
(cond ((eq? env the-empty-environment)
(error "Invalid environment!"))
((= frame-num 0) env)
(else (env-ref
(enclosing-environment env)
(- frame-num 1)))))