38 lines
890 B
Scheme
38 lines
890 B
Scheme
(define-type AE
|
|
[num (n number?)]
|
|
[add (lhs AE?)
|
|
(rhs AE?)]
|
|
[sub (lhs AE?)
|
|
(rhs AE?)])
|
|
|
|
;; calc : AE -> number
|
|
;; to define a calculator for AEs
|
|
|
|
(define (calc an-ae)
|
|
(type-case AE an-ae
|
|
[num (n) n]
|
|
[add (l r) (+ (calc l) (calc r))]
|
|
[sub (l r) (- (calc l) (calc r))]))
|
|
|
|
(test (calc (num 3)) 3)
|
|
(test (calc (add (num 3) (num 4))) 7)
|
|
(test (calc (add (sub (num 3) (num 4)) (num 7))) 6)
|
|
|
|
;; parse : sexp -> AE
|
|
;; to convert s-expressions into AEs
|
|
|
|
(define (parse sexp)
|
|
(cond
|
|
[(number? sexp) (num sexp)]
|
|
[(cons? sexp)
|
|
(case (first sexp)
|
|
[(+) (add (parse (second sexp))
|
|
(parse (third sexp)))]
|
|
[(-) (sub (parse (second sexp))
|
|
(parse (third sexp)))])]))
|
|
|
|
(test (calc (parse 3)) 3)
|
|
(test (calc (parse (list '+ 3 4))) 7)
|
|
(test (calc (parse (list '+ (list '- 3 4) 7))) 6)
|
|
|