#elisp
#elisp
Вопрос:
У меня есть следующий код:
(defun rember
(lambda (a lat)
(cond
((null lat) '())
(else (cond
((eq (car lat) a) (cdr lat))
(else (rember a
(cdr lat))))))))
(rember 2 '(4 5 6 7))
Когда я запускаю это с помощью C-x C-e
, я получаю следующую ошибку:
Invalid function: (lambda (lambda (a lat) (cond ((null lat) (quote nil)) (else (cond
((eq (car lat) a) (cdr lat)) (else (rember a (cdr lat))))))) nil)
Я не знаю почему. Кто-нибудь может помочь?
Комментарии:
1. Без каких-либо указаний на то, что это должно делать, мы можем только предполагать.
(defun rember (lambda (a lat) ...))
вероятно, должно быть(defun rember (a lat) ...)
2.
(defun rember (...))
вызывается функция,rember
которая принимает список аргументов...
и возвращает nil. В вашем случае список аргументов недействителен.
Ответ №1:
Похоже, вы смешиваете синтаксис Lisp и Scheme для определения функций. В Lisp, поскольку вы используете defun
вместо defvar
, уже подразумевается, что вы определяете функцию, поэтому вам не нужно переносить код в lambda
:
(defun rember (a lat)
(cond
((null lat) '())
(else (cond
((eq (car lat) a) (cdr lat))
(else (rember a
(cdr lat)))))))
(Далее вы обнаружите, что это else
не обрабатывается специально внутри cond
в Emacs Lisp, поэтому вам нужно будет использовать t
вместо этого.)
Комментарии:
1. Спасибо! Это имеет смысл.