#lang plait
(define-type AE
[Num (n : Number)]
[Add (l : AE) (r : AE)]
[Sub (l : AE) (r : AE)])
(define (parse-sexpr sxp)
(cond
[(s-exp-number? sxp)
(Num (s-exp->number sxp))]
[(and (s-exp-list? sxp)
(= 3 (length(s-exp->list sxp))))
(let* ([lst (s-exp->list sxp)]
[op (s-exp->symbol (first lst))]
[l (parse-sexpr (second lst))]
[r (parse-sexpr (third lst))])
(case op
[(+) (Add l r)]
[(-) (Sub l r)]
[else
(error 'parse (to-string op))]))]
[else (error 'parse (to-string sxp))]))