Введение
Конструкция языка программирования в 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 — остальную часть списка. По этой причине эти операции иногда называют "первый и остаток" или "голова и хвост".
In computer programming, CAR (car) /k//ɑr//audio=en us car. ogg/ and CDR (cdr) ('/k//ʌ//d//ər//audio=US Lisp CDR2. ogg/ or '/k//ʊ//d//ər//audio=US Lisp CDR. ogg/) are primitive operations on cons cells (or "non atomic S expressions") introduced in the Lisp programming language. A cons cell is composed of two pointers; the car operation extracts the first pointer, and the cdr operation extracts the second. Thus, the expression (car (cons x y)) evaluates to x, and (cdr (cons x y)) evaluates to y. When cons cells are used to implement singly linked lists (rather than trees and other more complicated structures), the car operation returns the first element of the list, while cdr returns the rest of the list. For this reason, the operations are sometimes given the names first and rest or head and tail.
Композиции
Композициям функций `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`.