Ошибка CLisp: "(x) не число"
Это моя функция, которая должна реализовывать инфиксную оценку для операций * и +.
(defun calculate(l)
(cond
((eql (cadr l) '+) (+ (car l) (cddr l)))
((eql (cadr l) '*) (- (car l) (cddr l)))
)
)
Когда я запускаю это со списком '(3 + 4), я получаю сообщение об ошибке "(4) - это не число". Есть идеи, в чем может быть проблема?
2 ответа
Решение
Часть с (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