Я пытаюсь оценить дерево выражений. Вот мой код:

(define (eval-tree expr-tree)
  (eval-treeaux eval-tree expr-tree))

(define (eval-treeaux f expr-tree)
  (if (null? expr-tree)
      0
      (cond ((equal? '+ (operator expr-tree)) (+ (left-op expr-tree) (right-op expr-tree)))
            ((equal? '- (operator expr-tree)) (- (left-op expr-tree) (right-op expr-tree)))
            ((equal? '* (operator expr-tree)) (* (left-op expr-tree) (right-op expr-tree)))
            ((equal? '/ (operator expr-tree)) (/ (left-op expr-tree) (right-op expr-tree)))
            (else (f eval-treeaux expr-tree)))))

Когда я запускаю это (eval-tree '((6 * 3) + (4 - 2))), это дает мне эту ошибку:

+: expects type <number> as 1st argument, given: (6 * 3); other arguments 
   were: (4 - 2)

Может ли кто-нибудь сказать мне, в чем проблема и как я могу это исправить?


Вот мой новый код:

(define (eval-tree expr-tree)
  (if (null? expr-tree)
      0
      ((eval-treeaux eval-tree (car expr-tree)) (eval-tree (cdr expr-tree)))))

(define (eval-treeaux f expr-tree)
  (cond ((null? expr-tree) '())
        ((not (isExpression expr-tree)) (list expr-tree))
        (else (cond ((equal? '+ (operator expr-tree)) (+ (left-op expr-tree) (right-op expr-tree)))
                    ((equal? '- (operator expr-tree)) (- (left-op expr-tree) (right-op expr-tree)))
                    ((equal? '* (operator expr-tree)) (* (left-op expr-tree) (right-op expr-tree)))
                    ((equal? '/ (operator expr-tree)) (/ (left-op expr-tree) (right-op expr-tree)))
                    (else (f eval-treeaux expr-tree))))))

Но когда я запускаю этот (eval-tree '((6 * 3) + (4 - 2))), я получаю эту ошибку:

procedure application: expected procedure, given: 2; arguments were: 0

Я действительно смущен. Кто-нибудь может мне помочь? Спасибо

0
prgrammer 14 Апр 2011 в 10:13
Я согласен с ответом ниже. Отдельный вопрос: почему вы возвращаете ноль в пустых списках? Кроме того, почему вы разделили эту функцию на eval-tree и eval-treeaux? Кроме того, почему вы передаете eval-tree eval-treeaux? Этот код нуждается в большой очистке!
 – 
John Clements
14 Апр 2011 в 21:40

1 ответ

Выражение ((6 * 3) + (4 - 2)) состоит из двух подвыражений:

 (6 * 3)  ; e_1
 (4 - 2)  ; e_2

Вам необходимо рекурсивно оценить подвыражения, прежде чем вы сможете оценить родительское выражение.

1
cam 14 Апр 2011 в 10:21
Это то, что я думал, что делаю в своем операторе else в вспомогательной функции. Нужна ли мне еще одна рекурсивная функция? Я не уверен, каким будет рекурсивное выражение.
 – 
prgrammer
14 Апр 2011 в 10:25
1
@prgrammer: недостаточно сделать это в else; вы также должны сделать это для операндов +, -, *, /, хотя такой подход выглядит уродливым. Вы захотите выполнить рекурсию в каждой подветке, но рефакторинг сделаете это чисто.
 – 
Chris Jester-Young
14 Апр 2011 в 10:57