Next: 連想リスト型, Previous: ボックスダイアグラムによるリストの描写, Up: コンスセルとリスト型 [Contents][Index]
ドットペア表記(dotted pair
notation)は、CARとCDRが明示的に表されたコンスセルの一般的な構文です。この構文では(a
.
b)
がCARがオブジェクトa、CDRがオブジェクトbという意味になります。CDRがリストである必要がないので、ドットペア表記はより一般的なリスト構文です。しかしリスト構文が機能するような場合には、より扱いにくくなります。ドットペア表記では、リスト‘(1
2 3)’は‘(1 . (2 . (3
.
nil)))’と記述されます。nil
で終端されたリストにたいしては、どちらの表記法も使用できますが、リスト表記の方が通常は明解で便利です。リストをプリントする場合には、コンスセルのCDRがリストでないときだけドットペア表記が使用されます。
以下はボックスを使用してドットペア表記を表した例です。これはペア(rose . violet)
を表します:
--- --- | | |--> violet --- --- | | --> rose
最後のCDRが非nil
のコンスセルのチェーンを表すので、ドットペア表記とリスト表記を組み合わせることができます。リストの最後の要素の後にドットを記述して、その後に最後のコンスセルのCDRを記述します。たとえば(rose
violet . buttercup)
は、(rose . (violet
. buttercup))
と等価です。オブジェクトは以下のようになります:
--- --- --- --- | | |--> | | |--> buttercup --- --- --- --- | | | | --> rose --> violet
構文(rose . violet .
buttercup)
は無効です。なぜならこれは何も意味していないからです。何か意味があるとしても、violet
のためにCDRがすでに使用されているコンスセルのCDRに、buttercup
を置くということになります。
リスト(rose violet)
は(rose . (violet))
と等価であり、以下のようになります:
--- --- --- --- | | |--> | | |--> nil --- --- --- --- | | | | --> rose --> violet
同様に3要素のリスト(rose violet buttercup)
は、(rose . (violet
. (buttercup)))
と等価です。
これは以下のようになります:
--- --- --- --- --- --- | | |--> | | |--> | | |--> nil --- --- --- --- --- --- | | | | | | --> rose --> violet --> buttercup
(a b . c)
と(a . (b
. c))
が等価であることの幾分特異な副作用として、一貫性のためにb
を空のシーケンスで置き換えると(a
. c)
と(a . ( . c))
も等価であることを意味します。これは( .
c)
がc
と等価であることも意味していますが、使われることはほとんどありません。