Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- (define (safe-eval ex)
- (cond
- [(number? ex) ex]
- [(string? ex) ex]
- [(bae? ex)
- (cond
- [(or(string? (bae-arg1 ex))(string? (bae-arg2 ex))) "divide by zero"]
- [else
- (cond
- [(symbol=? (bae-fn ex) '*)
- (cond [(or(string? (safe-eval (bae-arg1 ex)))(string?(safe-eval(bae-arg2 ex)))) "divide by zero"]
- [else (*(safe-eval (bae-arg1 ex))(safe-eval(bae-arg2 ex)))])]
- [(symbol=? (bae-fn ex) '+)
- (cond [(or(string? (safe-eval (bae-arg1 ex)))(string?(safe-eval(bae-arg2 ex)))) "divide by zero"]
- [else (+(safe-eval (bae-arg1 ex))(safe-eval(bae-arg2 ex)))])]
- [(symbol=? (bae-fn ex) '/)
- (cond [(equal? (safe-eval(bae-arg2 ex)) 0) "divide by zero"]
- [(or(string? (bae-arg1 ex))(string? (bae-arg2 ex))) "divide by zero"]
- [else (/(safe-eval (bae-arg1 ex))(safe-eval(bae-arg2 ex)))])]
- [(symbol=? (bae-fn ex) '-)
- (cond [(or(string? (safe-eval (bae-arg1 ex)))(string?(safe-eval(bae-arg2 ex)))) "divide by zero"]
- [else (-(safe-eval (bae-arg1 ex))(safe-eval(bae-arg2 ex)))])])])]))
- (check-expect (safe-eval (make-bae '* 2 6))12)
- (check-expect (safe-eval (make-bae '/ 2 0))"divide by zero")
- (check-expect (safe-eval (make-bae '+ 2 (make-bae '/ 5 0)))"divide by zero")
- (check-expect (safe-eval (make-bae '/ (make-bae '/ (make-bae '* 5 0)(make-bae '* 5 2))(make-bae '- 5 2)))0)
- (check-expect (safe-eval (make-bae '/ 1 (make-bae '- 5 5)))"divide by zero")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement