Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do you copy an array in common lisp?

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?

like image 392
nnythm Avatar asked Oct 27 '11 06:10

nnythm


People also ask

How do you duplicate an array?

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.

How do you copy an array in C#?

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 in Lisp?

Which keyword is used to construct an array? Explanation: The array can be constructed and its dimension can be set by using make-array.


1 Answers

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.

like image 183
Svante Avatar answered Sep 29 '22 13:09

Svante