Car and cdr
Encyclopedia : C : CA : CAR : Car and cdr
- The correct title of this } is }}}. The initial letter is capitalized due to [Naming conventions #Lower case first lettertechnical restrictions].
- "CADR" redirects here. This was also the name of the second version of MIT's Lisp machine
- For other meanings, see CAR and CDR.
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.
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,4Portions from NILS' LISP PAGES- [http://t3x.dyndns.org/LISP/QA/carcdr.html]
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 ...)
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 caring the result of repeated cdrs. See also cons.
References
- Russel, S. (undated, c. late 1950's) Writing and Debugging Programs. MIT Artificial Intelligence Laboratory Memo 6.
From Wikipedia, the Free Encyclopedia. Original article here. Support Wikipedia by contributing or donating.
All text is available under the terms of the GNU Free Documentation License See Wikipedia Copyrights for details.
