#lang plait
(define-type AE
[Num (n : Number)]
[Add (l : AE) (r : AE)]
[Sub (l : AE) (r : AE)])
(define (parse-sx sx)
(local
[(define (rec fn)
(parse-sx (fn (s-exp->list sx))))]
(cond
[(s-exp-match? `NUMBER sx)
(Num (s-exp->number sx))]
[(s-exp-match? `(+ ANY ANY) sx)
(Add (rec second) (rec third))]
[(s-exp-match? `(- ANY ANY) sx)
(Sub (rec second) (rec third))]
[else (error 'parse-sx (to-string sx))])))