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