UNB/ CS/ David Bremner/ teaching/ cs4613/ lectures/ lecture2/ snippet-031.rkt
#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))]))