Копировать массив в Common Lisp не очень просто, и я думаю, что это связано с тем, что массивы на этом языке являются структурами данных, особенно подходящими для программирования с побочными эффектами вместо программирования без побочных эффектов (или функционального),Как отметил @coredump, если вы предпочитаете использовать программирование без побочных эффектов, вам, вероятно, следует использовать другие структуры данных, такие как список списков или последовательности векторов.
Если вы хотите использовать массивы, вотальтернативный способ сделать вашу копию (не очень простой или эффективный!):
(defun swap-rows (matrix r1 r2)
"returns a copy of matrix with rows r1 ≤ r2 swapped"
(let* ((rows (array-dimension matrix 0))
(cols (array-dimension matrix 1)))
(flet ((get-rows (from-r to-r)
"get block of matrix from row from-r to row to-r excluded"
(loop for i from from-r below to-r
collect (loop for j from 0 below cols
collect (aref matrix i j)))))
(make-array
(list rows cols)
:initial-contents
(append (get-rows 0 r1)
(get-rows r2 (1+ r2))
(get-rows (1+ r1) r2)
(get-rows r1 (1+ r1))
(get-rows (1+ r2) rows))))))
На практике это преобразует исходный массив в блоки списков и перестраивает новый массив, начиная с этих списков.