Почему я получаю эту ошибку лямбда-выражения, и что я могу с этим поделать?
Я довольно новичок для шуток; Мне было интересно, может ли кто-нибудь здесь помочь мне.
У меня есть следующий фрагмент кода:
(defun write-lookup (binding-list pattern fact)
(cond
; No bindings have been stored
; Return the binding list with a new one!
((not binding-list) (cons (cons pattern fact) nil))
; A list of bindings is being stored
(cond
; The current binding matches
((equal (caar binding-list) pattern)
; Return the binding-list if value matches, nil else
(if (compare pattern fact) binding-list nil))
; Recursively search the rest of the list for the binding
((cdr binding-list) (write-lookup (cdr binding-list) pattern fact))
; The list doesn't have the binding.
; Return the binding-list with the added pattern
( T (cons (cons pattern fact) binding-list)))))
Когда я пытаюсь запустить его, я получаю следующее:
*** - SYSTEM::%EXPAND-FORM: (EQUAL (CAAR BINDING-LIST) PATTERN) should be a
lambda expression
Может ли кто-нибудь указать на мою ошибку? Спасибо!
2 ответа
Решение
Сначала вам нужно правильно сделать отступ в вашем коде:
(defun write-lookup (binding-list pattern fact)
(cond
; No bindings have been stored
; Return the binding list with a new one!
((not binding-list) (cons (cons pattern fact) nil))
; A list of bindings is being stored
(cond
; The current binding matches
((equal (caar binding-list) pattern)
; Return the binding-list if value matches, nil else
(if (compare pattern fact) binding-list nil))
; Recursively search the rest of the list for the binding
((cdr binding-list) (write-lookup (cdr binding-list) pattern fact))
; The list doesn't have the binding.
; Return the binding-list with the added pattern
(T (cons (cons pattern fact) binding-list)))))
Типичный редактор Lisp сделает это за вас нажатием клавиши.
Теперь вы можете легко заметить, что предложение T отсутствует для первого COND. Позвольте мне добавить это:
(defun write-lookup (binding-list pattern fact)
(cond
; No bindings have been stored
; Return the binding list with a new one!
((not binding-list) (cons (cons pattern fact) nil))
; A list of bindings is being stored
(t (cond
; The current binding matches
((equal (caar binding-list) pattern)
; Return the binding-list if value matches, nil else
(if (compare pattern fact) binding-list nil))
; Recursively search the rest of the list for the binding
((cdr binding-list) (write-lookup (cdr binding-list) pattern fact))
; The list doesn't have the binding.
; Return the binding-list with the added pattern
(T (cons (cons pattern fact) binding-list))))))
Я также переместил бы комментарий из кода:
(defun write-lookup (binding-list pattern fact)
(cond ((not binding-list) ; No bindings have been stored
(cons (cons pattern fact) nil)) ; Return the binding list with a new one!
(t ; A list of bindings is being stored
(cond ((equal (caar binding-list) pattern) ; The current binding matches
(if (compare pattern fact) ; Return the binding-list if value matches, nil else
binding-list
nil))
((cdr binding-list) ; Recursively search the rest list for the binding
(write-lookup (cdr binding-list) pattern fact))
(T ; The list doesn't have the binding.
(cons (cons pattern fact) ; Return the binding-list adding the pattern
binding-list))))))
Ваше вложенное использование cond выглядит подозрительно. Вы можете попробовать следующую форму, используя if:
(defun write-lookup (факт шаблона списка привязок); привязки не сохранены; вернуть список привязок с новой! (if (не список привязок) (cons (факт шаблона cons)) nil) (cond; текущий совпадения привязки ((равно (шаблон caar binding-list)); возвращает список привязки, если значение совпадает, nil else (если (сопоставить факт шаблона) список привязки nil)); рекурсивно ищите остальную часть списка для привязки ((cdr binding-list) (факт шаблона pattern write-lookup (cdr binding-list));; список не имеет привязки.; возвращает список привязок с добавленным шаблоном (T (cons (cons шаблон факта)) -список)))))
Извините за небольшое изменение форматирования; Emacs любит размещать комментарии справа.