| #| |
| <expr> ::= <num> |
| | {+ <expr> <expr>} |
| | {- <expr> <expr>} |
| |# |
| (deftype Expr |
| (num n) |
| (add l r) |
| (sub l r)) |
| |
| #| |
| <s-expr> ::= <num> |
| | (list '+ <s-expr> <s-expr>) |
| | (list '- <s-expr> <s-expr>) |
| |# |
| ;; parse :: s-expr -> Expr |
| (define (parse s-expr) |
| (match s-expr |
| [(? number?) (num s-expr)] |
| [(list '+ l r) (add (parse l) (parse r))] |
| [(list '- l r) (sub (parse l) (parse r))])) |
| |
| ;; calc :: Expr -> number |
| (define (calc expr) |
| (match expr |
| [(num n) n] |
| [(add l r) (+ (calc l) (calc r))] |
| [(sub l r) (- (calc l) (calc r))])) |
| |
| ;; run :: s-expr -> number |
| (define (run prog) |
| (calc (parse prog))) |