Я пытаюсь оценить дерево выражений. Вот мой код:
(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
Я действительно смущен. Кто-нибудь может мне помочь? Спасибо
1 ответ
Выражение ((6 * 3) + (4 - 2))
состоит из двух подвыражений:
(6 * 3) ; e_1
(4 - 2) ; e_2
Вам необходимо рекурсивно оценить подвыражения, прежде чем вы сможете оценить родительское выражение.
else
; вы также должны сделать это для операндов +
, -
, *
, /
, хотя такой подход выглядит уродливым. Вы захотите выполнить рекурсию в каждой подветке, но рефакторинг сделаете это чисто.
Похожие вопросы
Новые вопросы
scheme
Scheme - это функциональный язык программирования в семействе Lisp, тесно смоделированный на основе лямбда-исчисления с активным (аппликативным порядком) вычислением. ПО ВОПРОСАМ о схемах URL ПОЖАЛУЙСТА, используйте тег "URL-схема".