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)))です。ご覧のとおり、このような構造では、値は常にcarconsセル内にあり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への参照を作成するだけです。listcdr
+-----+-----+
| X | --------> list
+-----+-----+
の場合、次のようlistに(A B)機能します。
+-----+-----+ +-----+-----+ +-----+-----+
| X | --------> | A | --------> | B | NIL |
+-----+-----+ +-----+-----+ +-----+-----+
したがって、に(cons x '(a b))評価され(x a b)ます。
リストは、短所セルの非常に一般的な使用法の1つにすぎません。実際には、短所セル、循環リスト、または任意の有向グラフから任意のツリーを構築することもできます。