PLAI_Chapter3:A First Look at Interpretation

Let’s write an evaluator, in the form of an interpreter, for our arithmetic language.

数据类型和parser都和上一篇的一样,interp还是naive形态的。。。


#lang plai-typed

(define-type ArithC
  [numC (n : number)]
  [plusC (l : ArithC) (r : ArithC)]
  [multC (l : ArithC) (r : ArithC)])

(define (parse [s : s-expression]) : ArithC
  (cond
    [(s-exp-number? s) (numC (s-exp->number s))]
    [(s-exp-list? s)
     (let ([sl (s-exp->list s)])
       (case (s-exp->symbol (first sl))
         [(+) (plusC (parse (second sl)) (parse (third sl)))]
         [(*) (multC (parse (second sl)) (parse (third sl)))]
         [else (error 'parse "invalid list input")]))]
    [else (error 'parse "invalid input")]))

(define (interp [a : ArithC]) : number
  (type-case ArithC a
    [numC (n) n]
    [plusC (l r) (+ (interp l) (interp r))]
    [multC (l r) (* (interp l) (interp r))]))

(define (driver [s : s-expression]) : number  
  (interp (parse s)))

(driver '(+ 1 1))

你可能感兴趣的:(PLAI_Chapter3:A First Look at Interpretation)