CLisp错误:";(x) 不是数字;

CLisp错误:";(x) 不是数字;,lisp,common-lisp,infix-notation,clisp,infix-operator,Lisp,Common Lisp,Infix Notation,Clisp,Infix Operator,这是我的函数,应该为*和+操作实现中缀求值 (defun calculate(l) (cond ((eql (cadr l) '+) (+ (car l) (cddr l))) ((eql (cadr l) '*) (- (car l) (cddr l))) ) ) 当我使用列表(3+4)运行此命令时,会出现一个错误,即“(4)不是一个数字”。有什么问题吗?带有(cddr l)的零件应该是(caddr l)。您必须访问列表的第一个元素,而不是列表

这是我的函数,应该为*和+操作实现中缀求值

(defun calculate(l)
    (cond
        ((eql (cadr l) '+) (+ (car l) (cddr l)))
        ((eql (cadr l) '*) (- (car l) (cddr l)))
    )
)
当我使用列表(3+4)运行此命令时,会出现一个错误,即“(4)不是一个数字”。有什么问题吗?

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

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

符号可以被称为函数。因此,您的代码如下所示:

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

例如:

CL-USER 77 > (calculate '(20 + 30))
50

有一些功能的名称更容易理解:汽车优先。CADR最好排在第二位。CADDR第三个更好。我也想到了这一点,但请注意,在原始代码中只允许+和-。。。应提供附加代码,以检查是否只将支持的操作传递给
funcall
。类似于
(和(成员op'(+-)(funcall op…)
@DiegoSevilla:当然,他可以添加。应该不会太难。
CL-USER 77 > (calculate '(20 + 30))
50