Updated.
This commit is contained in:
+21
-15
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user