ОБНОВЛЕНИЕ : В настоящее время Александрия имеет copy-array
, очень похожую на реализацию, приведенную ниже. Используйте это.
ОТВЕТСТВЕННЫЙ ОТВЕТ : я использовал следующее, которое, по моему мнению, было лучше, чем версия Александрии в то время:
(defun copy-array (array &key
(element-type (array-element-type array))
(fill-pointer (and (array-has-fill-pointer-p array)
(fill-pointer array)))
(adjustable (adjustable-array-p array)))
"Returns an undisplaced copy of ARRAY, with same fill-pointer and
adjustability (if any) as the original, unless overridden by the keyword
arguments."
(let* ((dimensions (array-dimensions array))
(new-array (make-array dimensions
:element-type element-type
:adjustable adjustable
:fill-pointer fill-pointer)))
(dotimes (i (array-total-size array))
(setf (row-major-aref new-array i)
(row-major-aref array i)))
new-array))
Проблема с версией Александрии заключалась в том, что adjust-array
хак приводит к тому, что результат (по крайней мере, в SBCL) никогда не будет
simple-array
, чего ожидают некоторые другие библиотеки (например, opticl).
выше версия также была быстрее для меня.
Кто-то опубликовал очень похожую версию в другом
библиотека, но я забыл имена человека и библиотеки.