eoc/lint.rkt

30 lines
645 B
Racket

#lang racket
(require racket/fixnum)
(provide Int Prim Program interp-Lint)
(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))]
[(Prim '+ (list e1 e2)) (fx+ (interp-exp e1) (interp-exp e2))]))
(define (interp-Lint p)
(match p
[(Program '() body) (interp-exp body)]))