;;1. (+ 10 -10) (define express0 (make-add 10 -10)) ;;2. (+ (* 20 3) 33) (define express1 (make-add (make-mul 20 3) 33)) ;;3. (* 3.14 (* r r)) (define express2 (make-mul 3.14 (make-mul 'r 'r))) ;;4. (+ (* 9/5 c) 32) (define express3 (make-add (make-mul 9/5 'c) 32)) ;;5 (+ (* 3.14 (* o o)) (* 3.14 (* i i))) (define express4 (make-add (make-mul 3.14 (make-mul 'o 'o)) (make-mul 3.14 (make-mul 'i 'i)))) ;; numeric?: Expression --> Boolean ;; returns true if there are no symbols in express. (define (numeric? express) (cond [(add? express) (add-numeric? express)] [(mul? express) (mul-numeric? express)] [else false])) ;; add-numeric?: (make-add Expression Expression) --> Boolean ;; determines if all pieces of express are numeric (define (add-numeric? express) (cond [(and (add? (add-left express)) (add? (add-right express))) (and (add-numeric? (add-left express)) (add-numeric? (add-right express)))] [(and (number? (add-left express)) (add? (add-right express))) (and (number? (add-left express)) (add-numeric? (add-right express)))] [(and (add? (add-left express)) (number? (add-right express))) (and (add-numeric? (add-left express)) (number? (add-right express)))] [(and (number? (add-left express)) (number? (add-right express))) true] [(and (mul? (add-left express)) (mul? (add-right express))) (and (mul-numeric? (add-left express)) (mul-numeric? (add-right express)))] [(and (mul? (add-left express)) (add? (add-right express))) (and (mul-numeric? (add-left express)) (add-numeric? (add-right express)))] [(and (add? (add-left express)) (mul? (add-right express))) (and (add-numeric? (add-left express)) (mul-numeric? (add-right express)))] [(and (mul? (add-left express)) (number? (add-right express))) (and (mul-numeric? (add-left express)) (number? (add-right express)))] [(and (number? (add-left express)) (mul? (add-right express))) (and (number? (add-left express)) (mul-numeric? (add-right express)))] [else false] ) ) ;;mul-numeric?: (make-mul Expression Expression) --> Boolean ;;determines if all pieces of express are numeric (define (mul-numeric? express) (cond [(and (mul? (mul-left express)) (mul? (mul-right express))) (and (mul-numeric? (mul-left express)) (mul-numeric? (mul-right express)))] [(and (number? (mul-left express)) (mul? (mul-right express))) (and (number? (mul-left express)) (mul-numeric? (mul-right express)))] [(and (mul? (mul-left express)) (number? (mul-right express))) (and (mul-numeric? (mul-left express)) (number? (mul-right express)))] [(and (number? (mul-left express)) (number? (mul-right express))) true] [(and (add? (mul-left express)) (add? (mul-right express))) (and (add-numeric? (mul-left express)) (mul-numeric? (mul-right express)))] [(and (mul? (mul-left express)) (add? (mul-right express))) (and (mul-numeric? (mul-left express)) (add-numeric? (mul-right express)))] [(and (add? (mul-left express)) (mul? (mul-right express))) (and (add-numeric? (mul-left express)) (mul-numeric? (mul-right express)))] [(and (add? (mul-left express)) (number? (mul-right express))) (and (add-numeric? (mul-left express)) (number? (mul-right express)))] [(and (number? (mul-left express)) (add? (mul-right express))) (and (number? (mul-left express)) (add-numeric? (mul-right express)))] [else false] ) ) ;;examples/tests (equal? (numeric? express0) ;;should be true) (equal? (numeric? express1) ;;should be true) (equal? (numeric? express2) ;;should be false) (equal? (numeric? express3) ;;should be false) (equal? (numeric? express4) ;;should be false)