Cons
「consセル」を構築します。これは最初はリストとは何の関係もありません。consセルは2つの値のペアです。consセルは、「点線のペア」で書かれた形式で表されます。たとえば(A . B)
、2つの値'A
とを保持します'B
。
consセルの2つの場所は、「car」と「cdr」と呼ばれます。このようなconsセルを二等分されたブロックとして視覚化できます。
car cdr
+-----+-----+
| A | B |
+-----+-----+
Lispでは、値は他の何か、たとえば別のconsセルへの参照にすることもできます。
+-----+-----+ +-----+-----+
| A | --------> | B | C |
+-----+-----+ +-----+-----+
これは、「ドットペア」形式でとして表され(A . (B . C))
ます。次のように続行できます。
+-----+-----+ +-----+-----+ +-----+-----+
| A | --------> | B | --------> | C | D |
+-----+-----+ +-----+-----+ +-----+-----+
これは(A . (B . (C . D)))
です。ご覧のとおり、このような構造では、値は常にcar
consセル内にありcdr
、構造の残りの部分を指します。例外は、最後のにある最後の値ですcdr
。ただし、この例外は必要ありませんNIL
。Lispには「何もない」という特別な値があります。NIL
最後に入れるcdr
ことで、便利な番兵の値が得られ、すべての値は次のようになりますcar
。
+-----+-----+ +-----+-----+ +-----+-----+ +-----+-----+
| A | --------> | B | --------> | C | --------> | D | NIL |
+-----+-----+ +-----+-----+ +-----+-----+ +-----+-----+
これがLispでリストが構築される方法です。(A . (B . (C . (D . NIL))))
は少し扱いにくいので、単純にとして表すこともできます(A B C D)
。 NIL
空のリストとも呼ばれます()
; これらは同じものの交換可能な表記法です。
(cons x list)
これで、なぜ別のリストが返されるの かがわかります。Cons
で別のconsセルを作成x
し、:でcar
への参照を作成するだけです。list
cdr
+-----+-----+
| X | --------> list
+-----+-----+
の場合、次のようlist
に(A B)
機能します。
+-----+-----+ +-----+-----+ +-----+-----+
| X | --------> | A | --------> | B | NIL |
+-----+-----+ +-----+-----+ +-----+-----+
したがって、に(cons x '(a b))
評価され(x a b)
ます。
リストは、短所セルの非常に一般的な使用法の1つにすぎません。実際には、短所セル、循環リスト、または任意の有向グラフから任意のツリーを構築することもできます。