29 lines
578 B
Racket
29 lines
578 B
Racket
#lang racket
|
|
|
|
(require racket/fixnum)
|
|
|
|
(provide Int Prim Program interp-RInt)
|
|
|
|
(struct Int (value))
|
|
(struct Prim (op args))
|
|
|
|
(struct Program (info body))
|
|
|
|
(define (read-fixnum)
|
|
(let ([r (read)])
|
|
(cond
|
|
[(fixnum? r) r]
|
|
[else (error "invalid fixnum in input: " r)])))
|
|
|
|
|
|
(define (interp-exp sexp)
|
|
(match sexp
|
|
[(Int n) n]
|
|
[(Prim 'read '()) (read-fixnum)]
|
|
[(Prim '- (list e)) (fx- 0 (interp-exp e))]
|
|
[(Prim '+ (list e1 e2)) (fx+ (interp-exp e1) (interp-exp e2))]))
|
|
|
|
(define (interp-RInt p)
|
|
(match p
|
|
[(Program '() body) (interp-exp body)]))
|