Evaluating Expressions

left top right

(define (expression expr)
  (cond ((number? expr) expr)
        ((symbol? expr) (variable.value expr))
        ((binop? expr)
         (let ((op (binop.op expr))
               (rand-1 (expression 
                         (binop.left expr)))
               (rand-2 (expression
                         (binop.right expr))))
           (cond ((eq? op '+)
                  (+ rand-1 rand-2))
                 ((eq? op '*)
                  (* rand-1 rand-2))
                 (else (error "Bad operator"
                              expr)))))
        (else (error "Bad expression" expr))))

Jim Miller W3C