cons
создает пару, которая также является списком. Итак, когда вы позже cons
что-то еще добавляете в список, вы расширяете этот список.
(cons 'a 'b)
==> (a . b)
(cons 'c '(a . b))
==> (c a . b)
(cons 'd '(c a . b))
==> (d c a . b)
И это то, что происходит, когда вы cons
новая пара для другой пары / списка:
(cons 'something '(c . d))
==> (something c . d)
(cons '(a . b) (c . d))
==> ((a . b) c . d)
Иногда полезно нарисовать пары в виде блоков, чтобы увидеть, что происходит:
(cons 'a 'b) (cons 'c 'd)
+---+---+ +---+---+
| | |--- b | | |--- d
+---+---+ +---+---+
| |
a c
(cons (cons 'a 'b) (cons 'c 'd))
+---+---+ +---+---+
| | |--- | | |--- d
+---+---+ +---+---+
| |
| c
+---+---+
| | |--- b
+---+---+
|
a
Чтобы получить ((a . b) (c . d))
, вам необходимо:
(cons (cons 'a 'b) (cons (cons 'c 'd) '()))
==> ((a . b) (c . d))
+---+---+ +---+---+
| | |------- | | |--- NIL/()
+---+---+ +---+---+
| |
| |
+---+---+ +---+---+
| | |--- b | | |--- d
+---+---+ +---+---+
| |
a c