|
14 | 14 | (interp-env e '() ds)] |
15 | 15 | [e (interp-env e '() '())])) |
16 | 16 |
|
17 | | -;; Expr REnv (Listof Defn) -> Integer |
| 17 | +;; Expr REnv (Listof Defn) -> Answer |
18 | 18 | (define (interp-env e r ds) |
19 | 19 | (match e |
20 | 20 | [''() '()] |
21 | 21 | [(? value? v) v] |
22 | 22 | [(list (? prim? p) es ...) |
23 | | - (let ((as (interp-env* es r ds))) |
24 | | - (interp-prim p as))] |
| 23 | + (match (interp-env* es r ds) |
| 24 | + [(list vs ...) (interp-prim p vs)] |
| 25 | + [_ 'err])] |
25 | 26 | [`(if ,e0 ,e1 ,e2) |
26 | 27 | (match (interp-env e0 r ds) |
27 | 28 | ['err 'err] |
|
50 | 51 |
|
51 | 52 | ;; (Listof Defn) Symbol -> Defn |
52 | 53 | (define (defns-lookup ds f) |
53 | | - (findf (λ (d) (eq? (first (second d)) f)) |
| 54 | + (findf (match-lambda [`(define (,g . ,_) ,_) (eq? f g)]) |
54 | 55 | ds)) |
55 | 56 |
|
56 | | -;; [Listof Expr] REnv -> [Listof Answer] |
| 57 | +;; (Listof Expr) REnv -> (Listof Value) | 'err |
57 | 58 | (define (interp-env* es r ds) |
58 | 59 | (match es |
59 | 60 | ['() '()] |
60 | 61 | [(cons e es) |
61 | | - (cons (interp-env e r ds) |
62 | | - (interp-env* es r ds))])) |
| 62 | + (match (interp-env e r ds) |
| 63 | + ['err 'err] |
| 64 | + [v (cons v (interp-env* es r ds))])])) |
63 | 65 |
|
64 | 66 | ;; Any -> Boolean |
65 | 67 | (define (prim? x) |
|
76 | 78 | (value? (car x)) |
77 | 79 | (value? (cdr x))))) |
78 | 80 |
|
79 | | -;; Prim [Listof Answer] -> Answer |
80 | | -(define (interp-prim p as) |
81 | | - (match (cons p as) |
82 | | - [(list p (? value?) ... 'err _ ...) 'err] |
83 | | - [(list 'add1 (? integer? i0)) (+ i0 1)] |
84 | | - [(list 'sub1 (? integer? i0)) (- i0 1)] |
85 | | - [(list 'zero? (? integer? i0)) (zero? i0)] |
86 | | - [(list '+ (? integer? i0) (? integer? i1)) (+ i0 i1)] |
87 | | - [(list '- (? integer? i0) (? integer? i1)) (- i0 i1)] |
88 | | - [(list 'box v0) (box v0)] |
89 | | - [(list 'unbox (? box? v0)) (unbox v0)] |
90 | | - [(list 'empty? v0) (empty? v0)] |
91 | | - [(list 'cons v0 v1) (cons v0 v1)] |
92 | | - [(list 'car (cons v0 v1)) v0] |
93 | | - [(list 'cdr (cons v0 v1)) v1] |
| 81 | +;; Prim (Listof Value) -> Answer |
| 82 | +(define (interp-prim p vs) |
| 83 | + (match* (p vs) |
| 84 | + [('add1 (? integer? i0)) (add1 i0)] |
| 85 | + [('sub1 (? integer? i0)) (sub1 i0)] |
| 86 | + [('zero? (? integer? i0)) (zero? i0)] |
| 87 | + [('box v0) (box v0)] |
| 88 | + [('unbox (? box? v0)) (unbox v0)] |
| 89 | + [('empty? v0) (empty? v0)] |
| 90 | + [('cons v0 v1) (cons v0 v1)] |
| 91 | + [('car (cons v0 v1)) v0] |
| 92 | + [('cdr (cons v0 v1)) v1] |
| 93 | + [('+ (? integer? i0) (? integer? i1)) |
| 94 | + (+ i0 i1)] |
| 95 | + [('- (? integer? i0) (? integer? i1)) |
| 96 | + (- i0 i1)] |
94 | 97 | [_ 'err])) |
95 | 98 |
|
96 | 99 | ;; Env Variable -> Answer |
|
0 commit comments