Besides providing `foreign friendly' arrays, my
FFA package contained a lot of functions that implement commonly used array operations, including elementwise algebra operations, array minima and maxima, etc.
Because these do not depend on
CFFI, I decided I would put them into a separate package, named
ARRAY-OPERATIONS, which is also installable with
ASDF-Install. It contains a reimplementation of
array-range, and also a macro for vectorizing operations, called
vectorize:
(let ((a #(1d0 2d0 3d0))
(b #(4d0 5d0 6d0))
(c 0.25d0))
(vectorize (a b)
(+ a b c 0.25))) ; => #(5.5d0 7.5d0 9.5d0)
(vectorize (&rest vectors) expression) sets up symbol macros so that vector names in
vectors refer to the appropriate element, then evaluates
expression repeatedly and returns the results as a vector. It also has two keyword arguments:
result-element-type (which default to
'double-float) determines the element type of this vector, while
into places the results in one of the vectors instead (of course the two arguments are mutually exclusive).
(let ((a (vector 1 2 3)))
(vectorize (a) (+ 1 (* a 2)) :into a)
a) ; => #(3 5 7)
Functions in the new package still strive to create arrays that are foreign-friendly.