Форма do
в вашем примере содержит указатель на хвостовые концы, чтобы сделать добавление элемента в конец списка дешевой операцией.В противном случае необходимо будет постоянно просматривать список, чтобы найти последние недостатки - например, с помощью append
или nconc
.Другим способом было бы собрать новые элементы в заголовке и в конце обратить список результатов.
Можно было бы ожидать, что макрос LOOP
реализует что-то эффективное путем преобразования выражения цикла более высокого уровня в эффективный код.
Форма макроса
(loop for i upto 10 collect i)
может расшириться до чего-то, что внутренне похоже на ваш do
пример.Преимущество loop
заключается в том, что вам не нужно реализовывать логику для отслеживания хвоста, поскольку именно этот макрос должен сделать для вас.