ЛИСП машина последнего элемента? - PullRequest
2 голосов
/ 19 ноября 2010

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

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

Теперь я получаю возврат 4 за:

(caddar bar)

Возврат (5) для:

(cdddar bar)

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

(cadddar bar)

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

Ошибка:

; Warning: This function is undefined:
;   CADDDAR

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

Ответы [ 4 ]

8 голосов
/ 19 ноября 2010

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

Вы должны просто разобрать это:

2 голосов
/ 19 ноября 2010

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

1 голос
/ 26 марта 2012

Функции с более чем 4 a с и d с не определены стандартом, возможно, из-за того, что их 32 [и с этого момента экспоненциально запутывается].Безошибочный способ получить последний элемент списка: last возвращает последнюю ячейку cons, поэтому

(car (last list))

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

1 голос
/ 19 ноября 2010
(first (last (first '(((1 2) 3 4 5) ((6 7) 8 9 10)))))

-> 5
...