Недопустимая функция Elisp

#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. Спасибо! Это имеет смысл.