Updated.
This commit is contained in:
+21
-15
@@ -1,4 +1,4 @@
|
|||||||
#lang pl 04
|
#lang pl
|
||||||
|
|
||||||
; I added functions.
|
; I added functions.
|
||||||
|
|
||||||
@@ -85,16 +85,28 @@
|
|||||||
[else (error 'parse-sexpr "bad `with' syntax in ~s" sexpr)])]
|
[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 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 '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 'and a b) (andhelper a b)]
|
||||||
[(list a 'and b) (If (parse-sexpr a) (If (parse-sexpr b) pt pf) pf)]
|
[(list a 'and b) (andhelper a b)]
|
||||||
[(list 'or a b) (If (parse-sexpr a) pt (If (parse-sexpr b) pt pf))]
|
[(list 'or a b) (orhelper a b)]
|
||||||
[(list a 'or b) (If (parse-sexpr a) pt (If (parse-sexpr b) pt pf))]
|
[(list a 'or b) (orhelper a b)]
|
||||||
[(list 'not a) (If (parse-sexpr a) pf pt)]
|
[(list 'not a) (nothelper a)]
|
||||||
[(list 'lambda (symbol: arg) body) (Lambda arg (parse-sexpr body))]
|
[(list 'lambda (symbol: arg) body) (Lambda arg (parse-sexpr body))]
|
||||||
[(list f 'of arg) (Call (parse-sexpr f) (parse-sexpr arg))]
|
[(list f 'of arg) (Call (parse-sexpr f) (parse-sexpr arg))]
|
||||||
[(symbol: name) (Id name)]
|
[(symbol: name) (Id name)]
|
||||||
[else (error 'parse-sexpr "bad syntax in ~s" sexpr)]))
|
[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)
|
(: parse : String -> BAE)
|
||||||
;; parses a string containing an BAE expression to an BAE AST
|
;; parses a string containing an BAE expression to an BAE AST
|
||||||
(define (parse str)
|
(define (parse str)
|
||||||
@@ -169,25 +181,19 @@
|
|||||||
(: eval-sum : (Listof BAE) -> Number)
|
(: eval-sum : (Listof BAE) -> Number)
|
||||||
; Evaluates a Sum expression.
|
; Evaluates a Sum expression.
|
||||||
(define (eval-sum args)
|
(define (eval-sum args)
|
||||||
(define l (length args))
|
(foldr + 0 (map eval-number args)))
|
||||||
(cond [(= l 0) 0]
|
|
||||||
[(= l 1) (eval-number (first args))]
|
|
||||||
[else (+ (eval-number (first args)) (eval-sum (rest args)))]))
|
|
||||||
|
|
||||||
(: eval-mul : (Listof BAE) -> Number)
|
(: eval-mul : (Listof BAE) -> Number)
|
||||||
; Evaluates a Mul expression.
|
; Evaluates a Mul expression.
|
||||||
(define (eval-mul args)
|
(define (eval-mul args)
|
||||||
(define l (length args))
|
(foldr * 1 (map eval-number args)))
|
||||||
(cond [(= l 0) 1]
|
|
||||||
[(= l 1) (eval-number (first args))]
|
|
||||||
[else (* (eval-number (first args)) (eval-mul (rest args)))]))
|
|
||||||
|
|
||||||
(: eval-sub : BAE (Listof BAE) -> Number)
|
(: eval-sub : BAE (Listof BAE) -> Number)
|
||||||
; Evaluates a Sub expression.
|
; Evaluates a Sub expression.
|
||||||
(define (eval-sub fst args)
|
(define (eval-sub fst args)
|
||||||
(define l (length args))
|
(define l (length args))
|
||||||
(cond [(= l 0) (- (eval-number fst))]
|
(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)
|
(: eval-div : BAE (Listof BAE) -> Number)
|
||||||
; Evaluates a Div expression.
|
; Evaluates a Div expression.
|
||||||
|
|||||||
Reference in New Issue
Block a user