Additional procedure: array-assign!
Bradley Lucier 24 Jan 2017 19:29 UTC
I've realized that I left out an important procedure
(define (array-assign! destination source)
(cond ((not (mutable-array? destination))
(error "array-assign!: The first argument is not a mutable
array: " destination source))
((not (array? source))
(error "array-assign!: The second argument is not an array: "
destination source))
((not (interval= (array-domain destination)
(array-domain source)))
(error "array-assign!: The arguments do not have the same
domain: " destination source))
(else
(let ((source-getter
(array-getter source))
(destination-setter
(array-setter destination))
(domain
(array-domain destination)))
(interval-for-each
(case (interval-dimension domain)
((1) (lambda (i)
(destination-setter (source-getter i)
i)))
((2) (lambda (i j)
(destination-setter (source-getter i j)
i j)))
((3) (lambda (i j k)
(destination-setter (source-getter i j k)
i j k)))
((4) (lambda (i j k l)
(destination-setter (source-getter i j k l)
i j k l)))
(else
(lambda multi-index
(apply destination-setter
(apply source-getter multi-index)
multi-index))))
domain)))))
Search for "array-assign!" here:
http://www.math.purdue.edu/~lucier/srfi-122.html
for documentation and an example of its use in Gaussian elimination (LU
decomposition).
Because of my own programming style, I didn't realize for a long time
that such a procedure is necessary, but it *is* necessary for certain
applications if you want to get away from what I call "word-at-a-time"
array computing. So now I regret that it wasn't included in the "final"
SRFI.
I plan to add this procedure, documentation, and test code to my own
github repository. If I could add it to the SRFI, I would, but I'm
content with just adding it to my own repository and marking it as an
"augmented" SRFI 122, or something like that.
What do people think?
Brad