Я бы не использовал индексирование в списке дважды, используя nthcdr
, чтобы получить cdr ячейки cons, содержащей первый элемент, который вы хотите поменять, а затем используйте elt
, чтобы вывести оставшийся элемент из подсписка.Это означает, что вам нужно только один раз индексировать, начиная с заголовка списка.
(let ((list-tail (nthcdr i list)))
(rotatef (car list-tail)
(elt list-tail (- j i)))
list)
По крайней мере, с моей точки зрения, это достаточно утомительно, чтобы оправдать функцию.