Accessor CAR, CDR, CAAR, CADR, CDAR, CDDR, CAAAR, CAADR, CADAR, CADDR, CDAAR, CDADR, CDDAR, CDDDR, CAAAAR, CAAADR, CAADAR, CAADDR, CADAAR, CADADR, CADDAR, CADDDR, CDAAAR, CDAADR, CDADAR, CDADDR, CDDAAR, CDDADR, CDDDAR, CDDDDR
car x => object
cdr x => object
caar x => object
cadr x => object
cdar x => object
cddr x => object
caaar x => object
caadr x => object
cadar x => object
caddr x => object
cdaar x => object
cdadr x => object
cddar x => object
cdddr x => object
caaaar x => object
caaadr x => object
caadar x => object
caaddr x => object
cadaar x => object
cadadr x => object
caddar x => object
cadddr x => object
cdaaar x => object
cdaadr x => object
cdadar x => object
cdaddr x => object
cddaar x => object
cddadr x => object
cdddar x => object
cddddr x => object
(setf (car x) new-object)
(setf (cdr x) new-object)
(setf (caar x) new-object)
(setf (cadr x) new-object)
(setf (cdar x) new-object)
(setf (cddr x) new-object)
(setf (caaar x) new-object)
(setf (caadr x) new-object)
(setf (cadar x) new-object)
(setf (caddr x) new-object)
(setf (cdaar x) new-object)
(setf (cdadr x) new-object)
(setf (cddar x) new-object)
(setf (cdddr x) new-object)
(setf (caaaar x) new-object)
(setf (caaadr x) new-object)
(setf (caadar x) new-object)
(setf (caaddr x) new-object)
(setf (cadaar x) new-object)
(setf (cadadr x) new-object)
(setf (caddar x) new-object)
(setf (cadddr x) new-object)
(setf (cdaaar x) new-object)
(setf (cdaadr x) new-object)
(setf (cdadar x) new-object)
(setf (cdaddr x) new-object)
(setf (cddaar x) new-object)
(setf (cddadr x) new-object)
(setf (cdddar x) new-object)
(setf (cddddr x) new-object)
cadr: [’ka,duhr]
caddr: [’kaduh,duhr] or [’ka,dduhr]
cdr: [’k,duhr]
cddr: [’kduh,duhr] or [’kuh,dduhr]
x - リスト
object - オブジェクト
new-object - オブジェクト
xがコンスなら、carはconsのcarを返します。 xがnilなら、 carはnilを返します。
xがコンスなら、cdrはconsのcdrを返します。 xがnilなら、 cdrはnilを返します。
最大4つのcarとcdrの組み合わせを行う関数が用意されています。 これらの名前は、Cに続き、2つか3つか4つのAかDが現れ、 最後のRで構成されます。 各関数の名前にあるAとDの並びは、 その関数によって実行される一連のcar, cdrのオペレーションの 識別を意味しています。 AとDの順序は、対応するオペレーションの実行順序とは逆に現れます。 次の図は、その関係を正確に定義したものです。
これは、 ここと等価です
-----------------------------------------
(caar x) (car (car x))
(cadr x) (car (cdr x))
(cdar x) (cdr (car x))
(cddr x) (cdr (cdr x))
(caaar x) (car (car (car x)))
(caadr x) (car (car (cdr x)))
(cadar x) (car (cdr (car x)))
(caddr x) (car (cdr (cdr x)))
(cdaar x) (cdr (car (car x)))
(cdadr x) (cdr (car (cdr x)))
(cddar x) (cdr (cdr (car x)))
(cdddr x) (cdr (cdr (cdr x)))
(caaaar x) (car (car (car (car x))))
(caaadr x) (car (car (car (cdr x))))
(caadar x) (car (car (cdr (car x))))
(caaddr x) (car (car (cdr (cdr x))))
(cadaar x) (car (cdr (car (car x))))
(cadadr x) (car (cdr (car (cdr x))))
(caddar x) (car (cdr (cdr (car x))))
(cadddr x) (car (cdr (cdr (cdr x))))
(cdaaar x) (cdr (car (car (car x))))
(cdaadr x) (cdr (car (car (cdr x))))
(cdadar x) (cdr (car (cdr (car x))))
(cdaddr x) (cdr (car (cdr (cdr x))))
(cddaar x) (cdr (cdr (car (car x))))
(cddadr x) (cdr (cdr (car (cdr x))))
(cdddar x) (cdr (cdr (cdr (car x))))
(cddddr x) (cdr (cdr (cdr (cdr x))))
Figure 14-6. CARとCDRの対応setfは、これらの関数とともに使用することで xの既存の要素を変更することもできますが、 setfは新しい要素を作成しません。 よって、例えばsetfとcarはコンスのcarを変更できますが、 しかしsetfとcarでは、nilのcarを変更できません。 同じように、 setfのcaarは、 carがコンスであるコンスに対しては、 コンスのcarのcarを変更できますが、 しかしsetfのcaarでは、 nilや、 carがnilのコンスは、 どちらも変更できません。
引数xは、ドットリストと循環リストが許されます。
(car nil) => NIL
(cdr '(1 . 2)) => 2
(cdr '(1 2)) => (2)
(cadr '(1 2)) => 2
(car '(a b c)) => A
(cdr '(a b c)) => (B C)なし。
関数carとcdrは、 引数がリストではないときは、 型type-errorのエラーが発生します。 その他の関数(caar, cadr, …, cddddr)は、 エラーチェックのために、 carとcdrが定義されているように 適切に呼び出されたかのようにふるまう必要があります。
コンスのcarはrplacaを使うことによって変更できます。 コンスのcdrはrplacdを使うことによって変更できます。
(car x) == (first x)
(cadr x) == (second x) == (car (cdr x))
(caddr x) == (third x) == (car (cdr (cdr x)))
(cadddr x) == (fourth x) == (car (cdr (cdr (cdr x))))