Skip to content

Commit 91cbbef

Browse files
committed
Some clean up to the interp for Iniquity.
1 parent 9a98e01 commit 91cbbef

1 file changed

Lines changed: 25 additions & 22 deletions

File tree

www/notes/iniquity/interp.rkt

Lines changed: 25 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,15 @@
1414
(interp-env e '() ds)]
1515
[e (interp-env e '() '())]))
1616

17-
;; Expr REnv (Listof Defn) -> Integer
17+
;; Expr REnv (Listof Defn) -> Answer
1818
(define (interp-env e r ds)
1919
(match e
2020
[''() '()]
2121
[(? value? v) v]
2222
[(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])]
2526
[`(if ,e0 ,e1 ,e2)
2627
(match (interp-env e0 r ds)
2728
['err 'err]
@@ -50,16 +51,17 @@
5051

5152
;; (Listof Defn) Symbol -> Defn
5253
(define (defns-lookup ds f)
53-
(findf (λ (d) (eq? (first (second d)) f))
54+
(findf (match-lambda [`(define (,g . ,_) ,_) (eq? f g)])
5455
ds))
5556

56-
;; [Listof Expr] REnv -> [Listof Answer]
57+
;; (Listof Expr) REnv -> (Listof Value) | 'err
5758
(define (interp-env* es r ds)
5859
(match es
5960
['() '()]
6061
[(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))])]))
6365

6466
;; Any -> Boolean
6567
(define (prim? x)
@@ -76,21 +78,22 @@
7678
(value? (car x))
7779
(value? (cdr x)))))
7880

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)]
9497
[_ 'err]))
9598

9699
;; Env Variable -> Answer

0 commit comments

Comments
 (0)