CAR and CDR
From Wikipedia, the free encyclopedia
Introduced in the Lisp programming language, car (IPA ['kar], just like the English word "car") and cdr (IPA ['kʌ dər] or ['ku dər]) are primitive operations upon linked lists composed of cons cells. 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.
[edit] Origin of the names car and cdr
Lisp was originally designed for the IBM 704 computer, in the late 1950s. On the 704, a cons cell was represented by a single 36-bit machine word containing two parts: an address part and a decrement part, each 15 bits long. The assembly functions used to extract either part of a machine word were called car
(Contents of Address of Register) and cdr
(Contents of Decrement of Register).
The 704 assembler macro for cdr
was
- LXD JLOC,4
- CLA 0,4
- PDX 0,4
- PXD 0,4[1]
Nowadays some people mostly use first and rest when programming Lisp due to their greater clarity. However, the words car
and cdr
have an advantage over these synonyms: they can be composed. In Lisp, (cadr '(1 2 3))
is the equivalent of (car (cdr '(1 2 3))
; its value is 2
(the first item of the rest of (1 2 3)
. Similarly, (caar '((1 2) (3 4)))
is the same as (car (car '((1 2) (3 4))))
; its value is 1
. Most Lisps set a limit on the number of composed forms they support; Common Lisp and Scheme both provide forms with up to four repetitions of the a and d. While it's not clear that a complex composed form such as (cadadr ...)
is any easier for the untrained eye to parse than the spelled out equivalent (car (cdr (car (cdr ...))))
these composed forms can be convenient in certain idiomatic uses such as taking apart lists representing code. For instance given a lambda expression like the following:
(lambda (a b) (one-thing) (another-thing))
an experienced Lisper would read:
(let ((p1 (caadr form)) (p2 (cadadr form)) (body (cddr form)) ...)
as extracting the first and second parameters and then the list containing the body of the lambda expression. However this kind of "list destructuring" is common enough, especially when writing macros, that modern Lisps such as Common Lisp provide facilities for doing it directly. That code would be written in Common Lisp using the destructuring-bind macro like this:
(destructuring-bind ((p1 p2) &body body) form ...)
[edit] Use in conversation
cdr
is sometimes used colloquially in conversation (notably at MIT), usually in the expression "cdr down". For example:
Can you cdr down that list of restaurants to see if any are open at 3AM?
Note that this usage implies looking at each element in turn, which would actually be done by car
ing the result of repeated cdr
s. See also cons.
[edit] References
- ^ Portions from NILS' LISP PAGES- http://t3x.dyndns.org/LISP/QA/carcdr.html
- Russel, S. (undated, c. late 1950's) Writing and Debugging Programs. MIT Artificial Intelligence Laboratory Memo 6.
- McCarthy, John (1979-02-12). History of Lisp.
- Faase, Frans (2006-01-10). The origin of CAR and CDR in LISP.
- Graham, Paul (1996). ANSI Common Lisp. Prentice Hall. ISBN 0-13-370875-6.