-
Notifications
You must be signed in to change notification settings - Fork 2
/
interp.rkt
69 lines (58 loc) · 1.28 KB
/
interp.rkt
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
#lang racket
(provide interp interp-env)
(require "ast.rkt" "interp-prim.rkt")
;; type Answer = Value | 'err
;; type Value =
;; | Integer
;; | Boolean
;; | Character
;; | Eof
;; | Void
;; type REnv = (Listof (List Id Value))
;; Expr -> Answer
(define (interp e)
(interp-env e '()))
;; Expr Env -> Answer
(define (interp-env e r)
(match e
[(Int i) i]
[(Bool b) b]
[(Char c) c]
[(Eof) eof]
[(Var x) (lookup r x)]
[(Prim0 p) (interp-prim0 p)]
[(Prim1 p e)
(match (interp-env e r)
['err 'err]
[v (interp-prim1 p v)])]
[(Prim2 p e1 e2)
(match (interp-env e1 r)
['err 'err]
[v1 (match (interp-env e2 r)
['err 'err]
[v2 (interp-prim2 p v1 v2)])])]
;; TODO: Variadic +
[(If p e1 e2)
(match (interp-env p r)
['err 'err]
[v
(if v
(interp-env e1 r)
(interp-env e2 r))])]
[(Begin e1 e2)
(match (interp-env e1 r)
['err 'err]
[v (interp-env e2 r)])]
;; TODO: Let and Let*
;; TODO: Cond
))
;; Env Id -> Value
(define (lookup r x)
(match r
[(cons (list y val) r)
(if (symbol=? x y)
val
(lookup r x))]))
;; Env Id Value -> Env
(define (ext r v val)
(cons (list v val) r))