← Архив: Common Lisp

как добавить элемент в конец списка

Author: · 15.10.2011 00:15
· original author: pseudo-cat
В ходе простых эксперементов заметил, что append достаточно медлителен и вспомнилось что-то из схемы про set-cdr!. Я понимаю, что в повседневной жизни его использовать лучше не стоит,  но есть задачи где его продуманное применени обоснованно и может ускорить алгоритмы в разы, особенно на больших последовательностях. Это, в общем-то, обычная практика в нефункциональных ЯП и мне интересно, как в CL можно это реалищовать и будут ли сложности у  GC. Особенно интересует как получить последнюю cons пару в списке наиболее быстро(мб возможно хранить ссылку на неё и менять эту ссылку?).
· original author: pseudo-cat
если не понятно изложил, то вот примерно что я имею в виду - http://paste.lisp.org/display/125329
нужеy быстрый аналог last-cons
· original author: archimag
Естественно, добавление в конец связано с поиском этого самого конца. Если нужно много добавлять в конец списка, то нужно помнить последнюю ячейку (именно так делают loop и iterate для обработки collect) и модифицировать её с помощью nconc.
P.S. Вместо last-cons лучше всё таки использовать стандартную last.
· original author: pseudo-cat
а, собственно вопрос отпал, мне почему-то казалось, что last возвращает последнюю ячейку по-значению.
CL-USER> (let* ((l '(1 2 3))
                (last (last l))
)

           (rplacd last '(4 5 6))
           l
)