2010-11-19 3 views
2

LISP пень меня еще раз ... Почему я не могу получить значение последнего элемента в списке? У меня есть список настройки похож на это:LISP автомобиль последнего элемента?

(setq bar '(((1 2) 3 4 5)((6 7) 8 9 10))) 

Теперь я получаю возвращение 4 для:

(caddar bar) 

Существует возвращение (5) для:

(cdddar bar) 

Но я не могу получить 5 для:

(cadddar bar) 

Почему это - d как я могу получить значение 5?

Ошибка:

; Warning: This function is undefined: 
; CADDDAR 

Error in KERNEL:%COERCE-TO-FUNCTION: the function CADDDAR is undefined. 
[Condition of type UNDEFINED-FUNCTION] 

ответ

8

Функции с 5 или более а и д. Не определены. Всего 4 и меньше. Слишком много возможных функций этой длины, чтобы быть практичным.

Вы должны просто объяснить это: (car (cdr (cdr (cdr (cdr (car x))))))

+0

Ответ был: (автомобиль (cdddar lst)) .... теперь почему это! = Cadddar, я не понимаю. – toast

+2

Где-то глубоко внутри недр вашей реализации LISP есть: (defun cadr (x) ...) (defun cdar (x) ...) (defun caar (x) ...) (defun cddr (x) ...) и т. д. для всех комбинаций «a» и «d» длиной от 1 до 4. Спецификация не включает в себя длину 5, так как их слишком много. В семействе функций # 'cdadr нет ничего особенного. Они не обрабатываются однозначно. Это обычные функции. Вы более чем приветствуете (defun ...) некоторые новые, чтобы заполнить пробелы. – jtdubs

2

Ну, за сообщение об ошибке, нет cadddar функции. Имейте в виду, что car и cdr являются примитивными функциями чтения списка. Другие, такие как caddar, являются удобными функциями, которые построены из комбинации одного или нескольких car и cdr. То есть вы можете выполнять манипуляции с списком только с car и cdr, если caddar и т. Д. Не существует, расширенные функции просто упрощают вашу жизнь.

Таким образом, подход к этому заключается в синтезе собственного cadddar с использованием car и cdr. Если это не сразу видно, как это сделать, начните проще (с, скажем, cadr или cdar) и создайте до cadddar.

1
(first (last (first '(((1 2) 3 4 5) ((6 7) 8 9 10))))) 

-> 5 
1

Функции с более чем 4 a s и s d не определено стандартом, может быть, потому что есть 32 из них [и с тех пор становится экспоненциально более грязным.

безошибочный способ получить последний элемент списка: last возвращает последнюю ячейку минусы, так

(car (last list)) 

дает последний элемент списка. Конечно, list может быть чем-то вроде (first list).

Смежные вопросы