-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpractice4.11.scm
More file actions
57 lines (49 loc) · 1.5 KB
/
practice4.11.scm
File metadata and controls
57 lines (49 loc) · 1.5 KB
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
(define (enclosing-environment env) (cdr env))
(define (first-frame env) (car env))
(define the-empty-environment '())
(define (make-frame variables values)
(if (null? variables)
'()
(cons (cons (car variables) (car values))
(make-frame (cdr variables) (cdr values)))))
(define (add-binding-to-frame! var val frame)
(let ((new-pair (cons var val)))
(set! frame (cons new-pair frame))))
; test ok.
;(make-frame (list 1 2 3) (list 11 22 33))
(define (lookup-variable-value var env)
(define (env-loop env)
(define (scan pairs)
(cond ((null? pairs)
(env-loop (enclosing-environment env)))
((eq? (caar pairs) var)
(cadar pairs))
(else
(scan (cdr pairs)))))
(if (eq? env the-empty-environment)
(error "Unbound variable" var)
(let ((frame (first-frame env)))
(scan frame)))))
(define (set-variable-value! var val env)
(define (env-loop env)
(define (scan frame)
(cond ((null? frame)
(env-loop (enclosing-environment env)))
((eq? (caar frame) var)
(set-cdr! (car frame) val))
(else
(scan (cdr frame)))))
(if (eq? env the-empty-environment)
(error "Unbound variable" var)
(let ((frame (first-frame env)))
(scan frame)))))
(define (define-variable! var val env)
(let ((frame (first-frame env)))
(define (scan pairs)
(cond ((null? pairs)
(add-binding-to-frame! var val frame))
((eq? (caar pairs) var)
(set-cdr! (car pairs) val))
(else
(scan (cdr pairs)))))
(scan frame)))