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)
同じ事やるだけなのに、いろいろな書き方があるなあ。で、これ何に使うの?そのうち出てくるのかな。