Lispのリスト図解

Lispが扱うリストの構造を図解します。これは理解のためのイメージですので、必ずしも実装がこの図解のままの構造を使っているとは限りません。

リスト(正式にはproper list)のテキスト表現は要素をスペースで区切って並べてそれをカッコ()でくくります。

例えばリスト

(a 1 2.0)

は、最初の要素はシンボルaです。2番目の要素は整数1、3番目の要素は小数2.0です。

このリストの処理系内での構造を図にすると次のようになります。

 (a            1           2.0)

+---+---+    +---+---+    +---+---+    +---+
|CAR|CDR---->|CAR|CDR---->|CAR|CDR---> |nil|
+-|-+---+    +-|-+---+    +-|-----+    +---+
  |            |            |
  V            V            V
+---+        +---+        +---+
| a |        | 1 |        |2.0|
+---+        +---+        +---+

リストは、Consセルと呼ばれる部品から作られています。
Consセルは、CAR、CDRという名前のポインタを持ちます。
リストの要素は必ずCARが指し、CDRはリスト構造のために使います。

+---+---+   +---------+
|CAR|CDR--> | Object2 |
+-|-+---+   +---------+
  V
+---------+
| Object1 |
+---------+
(a 1) なら、

+---+---+    +---+---+    +---+
|CAR|CDR---->|CAR|CDR---->|nil|
+-|-+---+    +-|-+---+    +---+
  |            |            
  V            V
+---+        +---+        
| a |        | 1 |        
+---+        +---+       
(a) なら、

+---+---+    +---+
|CAR|CDR---->|nil|
+-|-+---+    +---+    
  |
  V          
+---+        
| a |        
+---+        
() なら、

+---+
|nil|
+---+

シンボルnilは、リスト構造の終わりを表す印として使われますが、要素が何もない空リストは、この印nilのみで表すのが自然です。そこで、シンボルnilはシンボルでありながら同時にリストでもあるという面白い性質を帯びることになります。

KISS>(symbolp 'nil) ;; nilはシンボルか?
t                   ;; yes

KISS>(listp 'nil)   ;; nilはリストか?
t                   ;; yes

KISS>(eq 'nil '())   ;; シンボルnil は 空リスト()と同一物か?
t                    ;; yes

KISS>(length '())    ;; ()の要素数は?
0                    ;; 空リストは要素を持たない

KISS>




コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です