15.1 Cons-ячейки

Ниже представлены несколько основных операций над cons-ячейками. В данных случаях cons-ячейки рассматриваются как пары, а не компоненты списка.

[Функция] car list

Функция возвращает car элемент списка list, который должен быть или cons-ячейкой или (). То есть аргумент должен удовлетворять предикату listp. По определению car элемент пустого списка является пустым списком. Если cons-ячейка является первым звеном списке, то можно сказать, что car возвращает первый элемент списка. Например:

(car ’(a b c))  a

Смотрите first.

car элемент cons-ячейки может быть изменён с помощью rplaca или setf.


[Функция] cdr list

Функция возвращает cdr элемент списка list, который должен быть или cons ячейкой или (). То есть аргумент должен удовлетворять предикату listp. По определению cdr элемент пустого списка является пустым списком. Если cons-ячейка является первым звеном списке, то можно сказать, что cdr возвращает остаток исходного списка без первого элемента. Например:

(cdr ’(a b c))  (b c)

Смотрите rest.

cdr элемент cons-ячейки может быть изменён с помощью rplacd или setf.


[Функция] caar list
[Функция] cadr list
[Функция] cdar list
[Функция] cddr list
[Функция] caaar list
[Функция] caadr list
[Функция] cadar list
[Функция] caddr list
[Функция] cdaar list
[Функция] cdadr list
[Функция] cddar list
[Функция] cdddr list
[Функция] caaaar list
[Функция] caaadr list
[Функция] caadar list
[Функция] caaddr list
[Функция] cadaar list
[Функция] cadadr list
[Функция] caddar list
[Функция] cadddr list
[Функция] cdaaar list
[Функция] cdaadr list
[Функция] cdadar list
[Функция] cdaddr list
[Функция] cddaar list
[Функция] cddadr list
[Функция] cdddar list
[Функция] cddddr list

Все композиции до четырёх car и cdr операций определены как самостоятельные функции. Их имена начинаются с c и заканчиваются r. Середина имени содержит последовательность букв a и d в соответствие с композиций выполняемых этими функциями. Например:

(cddadr x) is the same as (cdr (cdr (car (cdr x))))

Если в качестве аргумента указан список, тогда cadr вернёт второй элемент списка, caddr — третий, и cadddr — четвёртый. Если первый элемент списка является списком, тогда caar вернёт первый элемент этого подсписка, cdar — остаток подсписка без первого элемента, cadar — второй элемент подсписка и так далее.

В целях стиля, предпочтительнее определить функцию или макрос для доступа к части сложной структуры данных, а не использовать длинные car/cdr строки. Например, можно определить макрос для получения списка параметров лямбда-выражения:

(defmacro lambda-vars (lambda-exp) ‘(cadr ,lambda-exp))

и затем использовать lambda-vars вместо cadr. Смотрите также defstruct, которая будет автоматически определять новые типы данных и функции доступа к частям экземпляров этих структур.

Любая из этих функций может использоваться в связке с setf.


[Функция] cons x y

cons является (примитивной) функцией для создания новой cons-ячейки, у которой car элемент будет x, а cdr элемент — y. Например:

(cons ’a ’b)  (a . b)
(cons ’a (cons ’b (cons ’c ’())))  (a b c)
(cons ’a ’(b c d))  (a b c d)

cons может рассматриваться как для создания cons-ячейки, так и для добавления нового элемента в начало списка.


[Функция] tree-equal x y &key :test :test-not

Данный предикат истинен, если x и y являются изоморфными деревьями с идентичными листьями, то есть, если x и y являются атомами, которые удовлетворяют проверке (по-умолчанию eql), или если они оба являются cons-ячейками и их car элементы удовлетворяют tree-equal и cdr элементы удовлетворяют tree-equal. Таким образом tree-equal рекурсивно сравнивает cons-ячейки (но не любой другой составной объект). Смотрите equal, который рекурсивно сравнивает другие составные объекты, как например строки.

X3J13 voted in January 1989 to restrict user side effects; see section 7.9.

Пользователь ограничен в создании побочных действий так, как это описано в разделе 7.9