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