(define (apply op stack) (cond ((eq? op '+) (cons (+ (car stack)(cadr stack)) (cddr stack))) ((eq? op '-) (cons (- (car stack)(cadr stack))(cddr stack))) ((eq? op '*) (cons (* (car stack)(cadr stack))(cddr stack))) ((eq? op '/) (cons (/ (car stack)(cadr stack))(cddr stack))))) (define (isOp? sym) (or (eq? sym '+)(eq? sym '-)(eq? sym '*)(eq? sym '/))) (define (eval expr) (cond ((null? expr) (list)) ((isOp? (car expr)) (apply (car expr) (eval (cdr expr)))) ;; reduce stack (else (cons (car expr)(eval (cdr expr)))))) ;; push value (eval (list 0)) (eval (list '+ 4 5)) (eval (list '+ '- 4 3 '* 2 '/ 6 3))