表达式树评估
我试图评估表达式树。这里是我的代码:表达式树评估
(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
我真的很困惑。任何人都可以帮助我吗? 感谢
表达((6 * 3) + (4 - 2))
似乎是由2子表达式:
(6 * 3) ; e_1
(4 - 2) ; e_2
您需要递归评估子表达式,然后才能评估父表达。
这就是我认为我在aux函数的else语句中所做的事情。我需要另一个递归函数吗?我不确定递归表达式是什么。 – prgrammer 2011-04-14 06:25:36
@prgrammer:在'else'中做它是不够的。你也必须为'+',''''',''''的操作数做到这一点,尽管这种方法变得很难看。你会想要进入每个子分支,但重构干净地做。 – 2011-04-14 06:57:39
我同意下面的答案。一个单独的问题:为什么你在空列表上归零?另外,为什么你将这个函数分成eval-tree和eval-treeaux?另外,你为什么将eval-tree传递给eval-treeaux?这段代码需要大量的清理工作! – 2011-04-14 17:40:40