This commit is contained in:
2025-11-12 14:40:56 -05:00
parent 539973a96e
commit ff26cfd046
+21 -15
View File
@@ -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.