(define make-constant (lambda (x) x)) (define constant? number?) (define make-expr (lambda (left-operand operator right-operand) (list left-operand operator right-operand))) (define operator cadr) (define left-operand car) (define right-operand caddr) (define evaluate (lambda (expr) (cond ((constant? expr) expr) (else ((look-up-value (operator expr)) (evaluate (left-operand expr)) (evaluate (right-operand expr))))))) (define look-up-value (lambda (name) (cond ((equal? name 'plus) +) ((equal? name 'times) *) ((equal? name 'minus) -) ((equal? name 'divide) /) ((equal? name 'reversedminus) (lambda (x y) (- y x))) (else (error "Unrecognized name" name))))) (define operators-onto (lambda (expr lst) (if (constant? expr) lst (cons (operator expr) (operators-onto (left-operand expr) (operators-onto (right-operand expr) lst)))))) (define operators (lambda (expr) (operators-onto expr '())))