-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpractice4.16.scm
More file actions
68 lines (63 loc) · 1.83 KB
/
practice4.16.scm
File metadata and controls
68 lines (63 loc) · 1.83 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
58
59
60
61
62
63
64
65
66
67
68
(define (lookup-variable-value var env)
(define (env-loop env)
(define (scan vars vals)
(cond ((null? vars)
(env-loop (enclosing-environment env)))
((eq? (car vars) var)
(if (eq? (car vals) '*unassigned*)
(error "variable unassigned -- lookup-variable-value")
(car vals)))
(else
(scan (cdr vars) (cdr vals)))))
(if (eq? env the-empty-environment)
(error "Unbound variable -- lookup-variable-value" var)
(let ((frame (first-frame env)))
(scan (frame-variables frame) (frame-values frame)))))
(env-loop env))
; scribble
(define (scan-out-defines proc)
(define (define-clauses exps)
(cond ((null? exps) '())
((eq? (caar exps) 'define)
(cons (car exps) (define-clauses (cdr exps))))
(else '())))
(let ((clauses (define-clauses (cddr proc))))
(let ((define-vars (map cadr clauses))
(define-vals (map caddr clauses))
(define-body (cddr proc))
(lambda-vars (cadr proc)))
(list 'lambda lambda-vars
(cons 'let
(cons (map (lambda (x)
(list x '*unassigned*))
define-vars)
(map (lambda (x)
(if (eq? (car x) 'define)
(set-car! x 'set!)
x))
define-body)))))))
(define (scan-out-defines2 proc)
(let ((lambda-vars (cadr proc))
(lambda-body (cddr proc)))
(let ((define-clauses
(filter (lambda (x)
(eq? (car x) 'define))
lambda-body)))
(let ((define-vars (map cadr define-clauses))
(define-vals (map cddr define-clauses)))
(list 'lambda lambda-vars
(cons 'let
(cons (map (lambda (x)
(list x '*unassigned*))
define-vars)
(map (lambda (x)
(if (eq? (car x) 'define)
(cons 'set! (cdr xxb))
x))
lambda-body))))))))
(define exp '(lambda (x)
(define u u1)
(define v v1)
(exp)))
; ok
(scan-out-defines2 exp)