Списки представляют собой односвязные списки, поэтому возможно только добавление в начало без необходимости копировать части списка. Ваша попытка сделать копию первой пары, добавить вашу пару в качестве второго элемента, а затем разделить остальную часть исходного списка с аргументом.
Для добавления в качестве последнего элемента вам нужно сделать это, пока list
не станет пустым, а затем вернуть список с одним элементом. Ни один из минусов не будет общим. Итак:
(insert 'x '()) ; ==> (list 'x)
(insert 'x '(1)) ; ==> (cons '1 (insert 'x (cdr '(1))))
Конечно, это можно сделать с помощью append
. Лень вознаграждается в программировании:
(defun insert-last (item list)
(append list (list item)))
Знайте, что если у вас есть рекурсивная функция или итерация, где вы добавляете подобное для многих элементов в зависимости от аргументов, вы делаете очень плохой алгоритм. Гораздо лучше либо использовать loop
до collect
до конца, либо сделать список задом наперед, а на последнем шаге повернуть его вспять. Тогда вы получите n или 2n пропусков данных вместо n ^ 2.