Lisp勉強中(4) CARとCDR

たとえば(1 2 3)っていうリストがあったとすると、最初の要素は「1」という値と「次の要素はこちらですよ」という情報を持つ。で、2番目の要素は「2」という値と「次の要素はこちらですよ」という情報を持つ。そして3番目の要素は「3」という値と「ここで終わりです」という情報を持つ。

この「1」とかの値を持つ部分をCAR(かー)、「次の要素はこちらですよ」とか「ここで終わりです」とかの情報を持つ部分をCDR(くだー)と呼ぶらしい。つまり、リストのひとつひとつの要素はCARとCDRで構成されていて、CARには値が、CDRにはリストが続いているかどうか(どこに続いているか)の情報が入っていると。

[CAR][CDR] [CAR][CDR] [CAR][CDR]
 1    →    2    →    3    /

例えば(format t "Hello")というリストを評価するとき、最初の要素のCARを関数名、CDRを引数とする、という言い方ができる。余計ややこしいかも知れないけど。

car関数とcdr関数があって、それぞれを取り出せる。

(car '(1 2 3 4))
=>1

(cdr '(1 2 3 4))
=>(2 3 4)

carとcdrを組み合わせると、リストのいろんな部分を取り出せる。

(car (cdr '(1 2 3 4)))
=>2

(car (cdr (cdr '(1 2 3 4))))
=>3

(car (cdr (cdr (cdr '(1 2 3 4)))))
=>4

(cdr (cdr '(1 2 3 4)))
=>(3 4)

(cdr (cdr (cdr '(1 2 3 4))))
=>(4)

また、これを短く書くための関数もある。

(cadr '(1 2 3 4))
=>2

(caddr '(1 2 3 4))
=>3

(cadddr '(1 2 3 4))
=>4

(cddr '(1 2 3 4))
=>(3 4)

(cdddr '(1 2 3 4))
=>(4)

car関数と同じfirst関数、cadr関数と同じsecond関数、caddr関数と同じthird関数...って感じでtenth関数まである。また、cdr関数と同じrest関数ってのもある。

(first '(1 2 3 4))
=>1
(second '(1 2 3 4))
=>2
(third '(1 2 3 4))
=>3
(rest '(1 2 3 4))
=>(2 3 4)

同じ事やるだけなのに、いろいろな書き方があるなあ。で、これ何に使うの?そのうち出てくるのかな。