(define (make-tree entry left right) (list entry left right)) (define (entry tree) (car tree)) (define (left tree) (cadr tree)) (define (right tree) (caddr tree)) (define (parse expr) (parse-helper expr '() '())) (define (parse-helper expr operators operands) (cond ((null? expr) (if (null? operators) (car operands) (handle-op '() operators operands))) ((number? (car expr)) (parse-helper (cdr expr) operators (cons (make-tree (car expr) '() '()) operands))) ((list? (car expr)) (else (if (or (null? operators) (> (precedence (car expr)) (precedence (car operators)))) )))) ; form a subtree with the first operator and the first two operands and continue parsing (define (handle-op expr operators operands) (parse-helper expr (cdr operators) (cons (make-tree (car operators) (cadr operands) (car operands)) (cddr operands)))) (define (precedence oper) (if (member oper '(+ -)) 1 2)) (define (compute tree) ) (define (function-named-by oper) (cond ((equal? oper '+) +) ((equal? oper '-) -) ((equal? oper '*) *) ((equal? oper '/) /) (else (error "no such operator as" oper))))