コンスセルとは、CARスロットとCDRスロットと呼ばれる2つのスロットからなるオブジェクトです。各スロットには、任意のLispオブジェクトを保持できます。また、このコンスセルのCARとは、そのCARスロットが現在保持しているオブジェクトのことであり、CDRについても同様です。
リストとは、一連のコンスセルが連結されたもので、各コンスセルのCDRスロットに、次のコンスセルまたは空リストのいずれかが格納されています。空リストは実際にはシンボルnilです。詳細はリストを参照してください。ほとんどのコンスセルはリストの一部として用いられるため、コンスセルで構成されるあらゆる構造をリスト構造と呼びます。
C言語プログラマーへの注記:したがって、Lispのリストはコンスセルで構成される連結リストとして機能します。Lispではポインタが暗黙的であるため、値を保持するコンスセルスロットと、値を指すスロットを区別しません。
コンスセルはLispにおいて極めて中心的な存在であるため、コンスセルではないオブジェクトを指す言葉も用意されています。こうしたオブジェクトはアトムと呼ばれます。
リストの読み取り構文と表示形式は同一であり、左括弧、任意の数の要素、および右括弧で構成されます。以下にリストの例を示します。
(A 2 "A") ; A list of three elements. () ; A list of no elements (the empty list). nil ; A list of no elements (the empty list). ("A ()") ; A list of one element: the string"A ()". (A ()) ; A list of two elements:Aand the empty list. (A nil) ; Equivalent to the previous. ((A B C)) ; A list of one element ; (which is a list of three elements).
読み込むと、括弧内の各オブジェクトがリストの要素になります。つまり、各要素に対してコンスセルが作成されます。コンスセルのCARスロットには要素が格納され、そのCDRスロットはリストの次のコンスセルを参照し、そこにはリストの次の要素が格納されます。最後のコンスセルのCDRスロットにはnilが格納されるように設定されます。
CAR および CDR
という名称は、Lispの歴史に由来する。初期のLisp実装はIBM 704コンピュータ上で動作しており、このコンピュータではワードがアドレスとデクリメントの2つの部分に分かれていた。CAR はレジスタのアドレス部分の内容を抽出する命令であり、CDR はデクリメント部分の内容を抽出する命令であった。これに対し、コンスセルは、それを生成する関数 cons にちなんで名付けられており、その関数はさらに、セルの構築という目的から名付けられたものである。