GNU Emacs 32.0.50 (9008bf64c3) のマニュアルを PLaMo 翻訳で機械翻訳したものです。誤訳を含むことがあります。原文: https://www.gnu.org/software/emacs/manual/html_node/elisp/Cons-Cell-Type.html ・ emacs-doc.conao3.com

2.4.6 Consセルとリスト型

コンスセルとは、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: A and 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 にちなんで名付けられており、その関数はさらに、セルの構築という目的から名付けられたものである。