Ошибка 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
Другие вопросы по тегам