Skip to content

Commit db6ecd5

Browse files
author
Yin Wang
committed
first 3 interpreters
0 parents  commit db6ecd5

File tree

3 files changed

+142
-0
lines changed

3 files changed

+142
-0
lines changed

calculator.ss

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
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

r2-interpreter.ss

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
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)))

r3-interpreter.ss

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
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)))

0 commit comments

Comments
 (0)