Cadr

del.icio.us del.icio.us
Digg Digg
Furl Furl
Reddit Reddit
Rojo Rojo
Add to OnlyWire

Introduced in the Lisp programming language, car (pronounced /ˈkɑr/, just like the English word "car") and cdr (/ˈkʌdər/ or /ˈkʊ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 or head and tail.

Origin of the names car and cdr

Lisp was originally implemented on the IBM 704 computer, in the late 1950s. The 704 hardware had special support for splitting a 36-bit machine word into four parts, an "address part" and "decrement part" of 15 bits each and a "prefix part" and "tag part" of three bits each. Precursors to Lisp included functions car (short for "Contents of the Address part of Register number"), cdr ("Contents of the Decrement part of Register number"), cpr and ctr, each of which took a machine address as an argument, loaded the corresponding word from memory, and extracted the appropriate bits. The 704 assembler macro for cdr was

LXD JLOC,4
CLA 0,4
PDX 0,4
PXD 0,4[1]

A machine word could be reassembled by cons, which took four arguments (a,d,p,t). The prefix and tag parts were dropped in the early stages of Lisp's design, leaving CAR, CDR, and a two-argument CONS.[2]

The alternate names first and rest, which date back at least to 1959,[3] are sometimes preferred to car and cdr. However, car and cdr have the advantage that short compositions of the functions can be given short and more or less pronounceable names of the same form. 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.

Other languages

ML and Haskell are also functional languages which use the singly-linked list as a basic data structure. ML has functions "List.hd" and "List.tl"; and Haskell has functions "head" and "tail", which are analogous to "car" and "cdr", respectively. However, they are seldom used; instead, parts of the list are usually de-constructed using pattern matching.

References

  1. ^ Portions from NILS' LISP PAGES- http://t3x.dyndns.org/LISP/QA/carcdr.html
  2. ^ McCarthy, John (1979-02-12). "History of Lisp".
  3. ^ McCarthy, J., Erratum to Memo 8, Recursive Functions of Symbolic Expressions and Their Computation By Machine, dated March 13, 1959, retrieved September 19, 2008.

This article is from Wikipedia. All text is available under the terms of the GNU Free Documentation License.