CLisp error: "(x) is not number"
CLisp error: "(x) is not number"
这是我的函数,应该为 * 和 + 操作实现中缀评估。
(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)))
或
(defun calculate (l)
(destructuring-bind (arg1 op arg2)
l
(funcall op arg1 arg2)))
示例:
CL-USER 77 > (calculate '(20 + 30))
50
这是我的函数,应该为 * 和 + 操作实现中缀评估。
(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)))
或
(defun calculate (l)
(destructuring-bind (arg1 op arg2)
l
(funcall op arg1 arg2)))
示例:
CL-USER 77 > (calculate '(20 + 30))
50