diff --git a/compiler.rkt b/compiler.rkt index 1385616..c342d31 100644 --- a/compiler.rkt +++ b/compiler.rkt @@ -15,10 +15,12 @@ ;; flips the arguments of +. -Jeremy (define (flip-exp e) (match e + [(Int n) e] [(Var x) e] [(Prim 'read '()) (Prim 'read '())] [(Prim '- (list e1)) (Prim '- (list (flip-exp e1)))] - [(Prim '+ (list e1 e2)) (Prim '+ (list (flip-exp e2) (flip-exp e1)))])) + [(Prim '+ (list e1 e2)) (Prim '+ (list (flip-exp e2) (flip-exp e1)))] + [(Prim '- (list e1 e2)) (Prim '- (list (flip-exp e1) (flip-exp e2)))])) (define (flip-Lint e) (match e @@ -36,12 +38,18 @@ [((Int n1) (Int n2)) (Int (fx+ n1 n2))] [(_ _) (Prim '+ (list r1 r2))])) +(define (pe-sub r1 r2) + (match* (r1 r2) + [((Int n1) (Int n2)) (Int (fx- n1 n2))] + [(_ _) (Prim '- (list r1 r2))])) + (define (pe-exp e) (match e [(Int n) (Int n)] [(Prim 'read '()) (Prim 'read '())] [(Prim '- (list e1)) (pe-neg (pe-exp e1))] - [(Prim '+ (list e1 e2)) (pe-add (pe-exp e1) (pe-exp e2))])) + [(Prim '+ (list e1 e2)) (pe-add (pe-exp e1) (pe-exp e2))] + [(Prim '- (list e1 e2)) (pe-sub (pe-exp e1) (pe-exp e2))])) (define (pe-Lint p) (match p diff --git a/interp-Lint.rkt b/interp-Lint.rkt index c32bc55..329915b 100644 --- a/interp-Lint.rkt +++ b/interp-Lint.rkt @@ -26,6 +26,10 @@ (define v1 (interp-exp e1)) (define v2 (interp-exp e2)) (fx+ v1 v2)] + [(Prim '- (list e1 e2)) + (define v1 (interp-exp e1)) + (define v2 (interp-exp e2)) + (fx- v1 v2)] )) (define (interp-Lint p) @@ -55,6 +59,10 @@ (define v1 ((interp-exp env) e1)) (define v2 ((interp-exp env) e2)) (fx+ v1 v2)] + [(Prim '- (list e1 e2)) + (define v1 ((interp-exp env) e1)) + (define v2 ((interp-exp env) e2)) + (fx- v1 v2)] )) (define/public (interp-program p)