Если идиома «против» в начале, «закончить путем реверсирования» вам не подходит (если вам, например, нужно передать список другим функциям ВО ВРЕМЯ его построения), есть также трюк с отслеживанием конца. Тем не менее, вероятно, будет чище просто построить список, переместив его в начало, а затем закончить, используя reverse или nreverse, прежде чем, наконец, использовать его.
По сути, это позволяет вам иметь список в правильном порядке при его создании за счет необходимости отслеживать его.
(defun track-tail (count)
(let* ((list (cons 0 nil))
(tail list))
(loop for n from 1 below count
do (progn
(setf (cdr tail) (cons n nil))
(setf tail (cdr tail))
(format t "With n == ~d, the list is ~a~%" n list)))
list))
Это дает следующий результат:
CL-USER> (track-tail 5)
With n == 1, the list is (0 1)
With n == 2, the list is (0 1 2)
With n == 3, the list is (0 1 2 3)
With n == 4, the list is (0 1 2 3 4)
(0 1 2 3 4)
person
Vatine
schedule
26.06.2011