forked from chrisstephenson/CMPE314-2016
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmsl-starter.plai~
33 lines (30 loc) · 1 KB
/
msl-starter.plai~
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
#lang plai-typed
(define-type msl
[msl-num (n : number)]
[msl-add (lhs : msl) (rhs : msl)]
)
;; eval msl -> number
;; evaluate an msl expression
;; examples
;; (msl-num 7) -> 7
;; (msl-add (msl-num 3) (msl-num 4)) -> 7
;; (msl-add (msl-add (msl-num 3) (msl-num 4)) (msl-num 35)) -> 42
(define (eval [expr : msl])
(type-case msl expr
[msl-num (n) n]
[msl-add (lhs rhs) (+ (eval lhs) (eval rhs))]))
;; parse s-expression -> msl
;; convert a quoted s expression into the equivalent msl form
;; examples
;; '7 -> (msl-num 7)
;; '(+ 3 4) -> (msl-add (msl-num 3) (msl-num 4))
;; '(+ (+ 3 4) 35) -> (msl-add (msl-add (msl-num 3) (msl-num 4)) (msl-num 35))
(define (parse [s : s-expression]) : msl
(cond
[(s-exp-number? s) (msl-num (s-exp->number s))]
[(s-exp-list? s)
(let ([sl (s-exp->list s)])
(case (s-exp->symbol (first sl))
[(+) (msl-add (parse (second sl)) (parse (third sl)))]
[else (error 'parse "invalid list input")]))]
[else (error 'parse "invalid input")]))