Прежде всего (((() . 1) . 2) . 3)
- это не вложенный список - это вообще не список. (((() 1) 2) 3)
будет вложенным списком. (((() . 1) . 2) . 3)
- это пунктирная пара, первый элемент которой также является пунктирной парой.
Теперь объясним поведение, которое вы видите: В семействе языков lisp (cons a b)
создает пару, содержащую a
в качестве car
и b
в качестве cdr
.
Теперь список - это либо пустой список (()
), либо пара, чья cdr
также является списком (car
может содержать что угодно - если и cdr
, и car
являются списком список называется вложенным списком).
Пара, которая не является списком, называется пунктирной парой. Это то, что вы создаете здесь, потому что вы вызываете cons
со вторым аргументом, который не является списком.
Вывод:
Вы не можете использовать cons
для добавления в конец списка. Если вам нужно добавить в конец списка, вы можете использовать concat
со списком из одного элемента в качестве второго аргумента.
Обратите внимание, что добавление в конец списка - это операция O(n)
, в то время как добавление спереди (с использованием cons
) - это операция O(1)
, поэтому, если возможно, вы должны изменить свой алгоритм, чтобы он был только нужно добавить в передней части.