I'd like to make copies of my 2D array, which feels like the nice, functional, nondestructive way of handling arrays. What is the lispy way of doing this?
To duplicate an array, just return the element in your map call. numbers = [1, 2, 3]; numbersCopy = numbers. map((x) => x); If you'd like to be a bit more mathematical, (x) => x is called identity.
CopyTo copies all the elements of the current array to the specified destination array. This method should be called from the source array and it takes two parameters. The first being the array you want to copy to, and the second parameter tells it what index of the destination array it should start copying into.
Which keyword is used to construct an array? Explanation: The array can be constructed and its dimension can be set by using make-array.
UPDATE: Nowadays, alexandria has a copy-array
very similar to the implementation given below. Use that.
OBSOLETE ANSWER: I used the following, which I believed was better than the alexandria version at the time:
(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))
The problem with the alexandria version was that the adjust-array
hack causes the result (at least on SBCL) to never be a
simple-array
, which some other libraries (e.g. opticl) expect. The
above version also was faster for me.
Someone else has published a very similar version in a different library, but I forgot the names of both person and library.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With