0

这是我应该为 * 和 + 操作实现中缀评估的函数。

(defun calculate(l)
    (cond
        ((eql (cadr l) '+) (+ (car l) (cddr l)))
        ((eql (cadr l) '*) (- (car l) (cddr l)))
    )
)

当我使用列表 '(3 + 4) 运行它时,它给了我一个错误,说“(4) 不是数字”。任何想法可能是什么问题?

4

2 回答 2

5

符号可以称为函数。因此,您的代码就是这样的:

(defun calculate (l)
  (funcall (second l) (first l) (third l)))

或者

(defun calculate (l)
  (destructuring-bind (arg1 op arg2)
      l
    (funcall op arg1 arg2)))

例子:

CL-USER 77 > (calculate '(20 + 30))
50
于 2015-08-10T19:35:13.290 回答
3

(cddr l)应为的部分(caddr l)。您必须访问列表的第一个元素,而不是列表。代码应该是:

(defun calculate(l)
    (cond
        ((eql (cadr l) '+) (+ (car l) (caddr l)))
        ((eql (cadr l) '*) (- (car l) (caddr l)))
    )
)
于 2015-08-10T18:55:51.173 回答