diff --git a/07-bae/main.rkt b/07-bae/main.rkt index a943047..b1dff91 100644 --- a/07-bae/main.rkt +++ b/07-bae/main.rkt @@ -1,4 +1,4 @@ -#lang pl 04 +#lang pl ; I added functions. @@ -85,16 +85,28 @@ [else (error 'parse-sexpr "bad `with' syntax in ~s" sexpr)])] [(list 'if p b a) (If (parse-sexpr p) (parse-sexpr b) (parse-sexpr a))] [(list 'if p 'then b 'else a) (If (parse-sexpr p) (parse-sexpr b) (parse-sexpr a))] - [(list 'and a b) (If (parse-sexpr a) (If (parse-sexpr b) pt pf) pf)] - [(list a 'and b) (If (parse-sexpr a) (If (parse-sexpr b) pt pf) pf)] - [(list 'or a b) (If (parse-sexpr a) pt (If (parse-sexpr b) pt pf))] - [(list a 'or b) (If (parse-sexpr a) pt (If (parse-sexpr b) pt pf))] - [(list 'not a) (If (parse-sexpr a) pf pt)] + [(list 'and a b) (andhelper a b)] + [(list a 'and b) (andhelper a b)] + [(list 'or a b) (orhelper a b)] + [(list a 'or b) (orhelper a b)] + [(list 'not a) (nothelper a)] [(list 'lambda (symbol: arg) body) (Lambda arg (parse-sexpr body))] [(list f 'of arg) (Call (parse-sexpr f) (parse-sexpr arg))] [(symbol: name) (Id name)] [else (error 'parse-sexpr "bad syntax in ~s" sexpr)])) +(: andhelper : Sexpr Sexpr -> BAE) +(define (andhelper a b) + (If (parse-sexpr a) (If (parse-sexpr b) pt pf) pf)) + +(: orhelper : Sexpr Sexpr -> BAE) +(define (orhelper a b) + (If (parse-sexpr a) pt (If (parse-sexpr b) pt pf))) + +(: nothelper : Sexpr -> BAE) +(define (nothelper a ) + (If (parse-sexpr a) pf pt)) + (: parse : String -> BAE) ;; parses a string containing an BAE expression to an BAE AST (define (parse str) @@ -169,25 +181,19 @@ (: eval-sum : (Listof BAE) -> Number) ; Evaluates a Sum expression. (define (eval-sum args) - (define l (length args)) - (cond [(= l 0) 0] - [(= l 1) (eval-number (first args))] - [else (+ (eval-number (first args)) (eval-sum (rest args)))])) + (foldr + 0 (map eval-number args))) (: eval-mul : (Listof BAE) -> Number) ; Evaluates a Mul expression. (define (eval-mul args) - (define l (length args)) - (cond [(= l 0) 1] - [(= l 1) (eval-number (first args))] - [else (* (eval-number (first args)) (eval-mul (rest args)))])) + (foldr * 1 (map eval-number args))) (: eval-sub : BAE (Listof BAE) -> Number) ; Evaluates a Sub expression. (define (eval-sub fst args) (define l (length args)) (cond [(= l 0) (- (eval-number fst))] - [else (- (eval-number fst) (eval-sum args))])) ; Huh. + [else (- (eval-number fst) (eval-sum args))])) (: eval-div : BAE (Listof BAE) -> Number) ; Evaluates a Div expression.