File tree 3 files changed +142
-0
lines changed 3 files changed +142
-0
lines changed Original file line number Diff line number Diff line change
1
+ (define tree-sum
2
+ (lambda (exp )
3
+ (match exp
4
+ [(? number? x) x]
5
+ [`(,e1 ,e2)
6
+ (let ([v1 (tree-sum e1)]
7
+ [v2 (tree-sum e2)])
8
+ (+ v1 v2))])))
9
+
10
+
11
+
12
+ (tree-sum ' (1 2 ))
13
+ ; ; => 3
14
+
15
+ (tree-sum ' (1 (2 3 )))
16
+ ; ; => 6
17
+
18
+ (tree-sum ' ((1 2 ) 3 ))
19
+ ; ; => 6
20
+
21
+ (tree-sum ' ((1 2 ) (3 4 )))
22
+ ; ; => 10
Original file line number Diff line number Diff line change
1
+ #lang racket
2
+
3
+ (struct Closure (f env))
4
+
5
+ (define env0 '())
6
+
7
+ (define ext-env
8
+ (lambda (x v env )
9
+ (cons `(,x . ,v) env)))
10
+
11
+ (define lookup
12
+ (lambda (x env )
13
+ (let ([p (assq x env)])
14
+ (cond
15
+ [(not p) x]
16
+ [else (cdr p)]))))
17
+
18
+ (define interp
19
+ (lambda (exp env )
20
+ (match exp
21
+ [(? symbol? x) (lookup x env)]
22
+ [(? number? x) x]
23
+ [`(lambda (,x) ,e)
24
+ (Closure exp env)]
25
+ [`(let ([,x ,e1]) ,e2)
26
+ (let ([v1 (interp e1 env)])
27
+ (interp e2 (ext-env x v1 env)))]
28
+ [`(,e1 ,e2)
29
+ (let ([v1 (interp e1 env)]
30
+ [v2 (interp e2 env)])
31
+ (match v1
32
+ [(Closure `(lambda (,x) ,e) env-save)
33
+ (interp e (ext-env x v2 env-save))]))]
34
+ [`(,op ,e1 ,e2)
35
+ (let ([v1 (interp e1 env)]
36
+ [v2 (interp e2 env)])
37
+ (match op
38
+ ['+ (+ v1 v2)]
39
+ ['- (- v1 v2)]
40
+ ['* (* v1 v2)]
41
+ ['/ (/ v1 v2)]))])))
42
+
43
+ (define interpreter
44
+ (lambda (exp )
45
+ (interp exp env0)))
Original file line number Diff line number Diff line change
1
+ #lang racket
2
+
3
+ (struct Scope (table parent))
4
+ (struct Closure (f env))
5
+
6
+ (define env0 (Scope (make-hash) #f ))
7
+
8
+ (define ext-env
9
+ (lambda (env )
10
+ (let* ([new-hash (make-hash)]
11
+ [new-env (Scope new-hash env)])
12
+ new-env)))
13
+
14
+ (define def
15
+ (lambda (x v env )
16
+ (hash-set! (Scope-table env) x v)))
17
+
18
+ (define bind
19
+ (lambda (x v env )
20
+ (let (new-env (ext-env env))
21
+ (def x v new-env)
22
+ new-env)))
23
+
24
+ (define lookup
25
+ (lambda (x env )
26
+ (cond
27
+ [(not env) #f ]
28
+ [else
29
+ (let ([v? (hash-ref (Scope-table env) x #f )])
30
+ (cond
31
+ [(not v?)
32
+ (lookup x (Scope-parent env))]
33
+ [else v?]))])))
34
+
35
+ (define interp
36
+ (lambda (exp env )
37
+ (match exp
38
+ [(? symbol? x)
39
+ (let ([v (lookup x env)])
40
+ (cond
41
+ [(not v)
42
+ (error " undefined variable" x)]
43
+ [else v]))]
44
+ [(? number? x) x]
45
+ [`(lambda (,x) ,e)
46
+ (Closure exp env)]
47
+ [`(let ([,x ,e1]) ,e2)
48
+ (let ([v1 (interp e1 env)])
49
+ (interp e2 (ext-env x v1 env)))]
50
+ [`(define ,x ,e)
51
+ (let ([v1 (interp e env)])
52
+ (def x v1 env))]
53
+ [`(begin ,e1 ... ,en)
54
+ (for ([e e1])
55
+ (interp e env))
56
+ (interp en env)]
57
+ [`(,e1 ,e2)
58
+ (let ([v1 (interp e1 env)]
59
+ [v2 (interp e2 env)])
60
+ (match v1
61
+ [(Closure `(lambda (,x) ,e) env-save)
62
+ (interp e (ext-env x v2 env-save))]))]
63
+ [`(,op ,e1 ,e2)
64
+ (let ([v1 (interp e1 env)]
65
+ [v2 (interp e2 env)])
66
+ (match op
67
+ ['+ (+ v1 v2)]
68
+ ['- (- v1 v2)]
69
+ ['* (* v1 v2)]
70
+ ['/ (/ v1 v2)]))])))
71
+
72
+
73
+ (define interpreter
74
+ (lambda (exp )
75
+ (interp exp env0)))
You can’t perform that action at this time.
0 commit comments