Введение

Конструкция языка программирования в Lisp. В компьютерном программировании CAR (car) /k//ɑr//audio=en us car. ogg/ и CDR (cdr) ('/k//ʌ//d//ər//audio=US Lisp CDR2. ogg/ или '/k//ʊ//d//ər//audio=US Lisp CDR. ogg/) — это примитивные операции над ячейками cons (или "неатомарными S-выражениями"), представленные в языке программирования Lisp. Ячейка cons состоит из двух указателей: операция car извлекает первый указатель, а операция cdr — второй. Таким образом, выражение (car (cons x y)) вычисляется как x, а (cdr (cons x y)) вычисляется как y. Когда ячейки cons используются для реализации односвязных списков (а не деревьев и других более сложных структур), операция car возвращает первый элемент списка, а операция cdr — остальную часть списка. По этой причине эти операции иногда называют "первый и остаток" или "голова и хвост".

Композиции

Композициям функций `car` и `cdr` можно дать короткие и более или менее произносимые имена одинаковой формы. В Lisp, `(cadr '(1 2 3))` эквивалентно `(car (cdr '(1 2 3)))`; его значение равно 2. Аналогично, `(caar '((1 2) (3 4)))` (произносится `/k//eɪ//ɑr/`) то же самое, что `(car (car '((1 2) (3 4))));` его значение равно 1. Большинство реализаций Lisp, например Common Lisp и Scheme, систематически определяют все вариации от двух до четырех последовательных применений функций `car` и `cdr`.

Другие компьютерные языки

Многие языки (особенно функциональные языки и языки, находящиеся под влиянием функциональной парадигмы) используют односвязный список как базовую структуру данных и предоставляют примитивы или функции, аналогичные `car` и `cdr`. Они могут называться по-разному: `first` и `rest`, `head` и `tail` и т.д. Однако в Lisp ячейка `cons` используется не только для построения односвязных списков, но и для построения пар и вложенных парных структур, то есть `cdr` ячейки `cons` необязательно должен быть списком. В этом случае большинство других языков предоставляют различные примитивы, поскольку обычно различают парные структуры и списки либо типовым, либо семантическим способом. В частности, в языках со статической типизацией списки, пары и деревья будут иметь различные функции доступа с разными сигнатурами типов: например, в Haskell `car` и `cdr` становятся `fst` и `snd` при работе с типом пары. Точные аналоги `car` и `cdr` поэтому редко встречаются в других языках. Clojure использует `first` вместо `car` и `next` или `rest` вместо `cdr`. Logo, напротив, использует `first` вместо `car` и `butfirst` вместо `cdr`.