ドットペア表記は、CAR と CDR を明示的に表す cons セルの汎用的な構文です。この構文において、(a . b)
は、CAR がオブジェクト a であり、CDR がオブジェクト b である cons
セルを表します。ドットペア表記は、CDR
がリストである必要がないため、リスト構文よりも汎用的です。しかし、リスト構文で十分な場合には、かえって煩雑になります。ドットペア表記では、リスト
‘(1 2 3)’ は ‘(1 . (2 . (3 . nil)))’ と記述されます。nil
で終端するリストについては、どちらの表記も使用可能ですが、通常はリスト表記の方が明確で便利です。リストを出力する際、ドットペア表記が用いられるのは、cons
セルの CDR がリストではない場合に限られます。
以下に、ボックスを用いて点付きペア表記を説明する例を示します。この例ではペア (rose
. violet) を示しています:
--- ---
| | |--> violet
--- ---
|
|
--> rose
ドットペア表記とリスト表記を組み合わせることで、末尾のCDRがnilではないコンスセルの連鎖を簡潔に表現できます。リストの最後の要素の後にドットを書き、続いて最後のコンスセルのCDRを記述します。例えば、(rose violet
. buttercup)は(rose . (violet
. buttercup))と同等です。オブジェクトは以下のようになります。
--- --- --- ---
| | |--> | | |--> buttercup
--- --- --- ---
| |
| |
--> rose --> violet
構文 (rose . violet . buttercup)
は、それが意味し得るものが何もないため、無効です。あえて言うなら、CDR がすでに violet に使用されているコンスセルの CDR
に、buttercup を入れることを指示することになります。
リスト (rose violet) は (rose
. (violet)) と等価であり、次のようになります:
--- --- --- ---
| | |--> | | |--> nil
--- --- --- ---
| |
| |
--> rose --> violet
同様に、3要素のリスト (rose violet buttercup) は (rose . (violet . (buttercup))) と等価です。 見た目は次のようになります。
--- --- --- --- --- ---
| | |--> | | |--> | | |--> nil
--- --- --- --- --- ---
| | |
| | |
--> rose --> violet --> buttercup