Re: superfluous functions?
Bradley Lucier 07 Oct 2015 01:15 UTC
How's this for a new API and description for array-curry (still in
progress):
Procedure: array-curry array outer-dimension [ subarray-type 'immutable ]
If array is an array whose domain is an interval [l0, u0) x ... x [ld-1,
ud-1) and outer-dimension is an exact integer strictly between 0 and d,
then array-curry returns an (immutable) array with domain [l0, u0) x
...x [louter-dimension-1, uouter-dimension-1), each of whose entries is
in itself an array with domain [louter-dimension, uouter-dimension) x
... x [ld-1, ud-1).
The type of the subarrays is determined by the optional argument
subarray-type in combination with the type of the input array.
If subarray-type is 'mutable, and the input array is mutable (which
includes specialized arrays), then each subarray is mutable.
If subarray-type is 'specialized and the input array is specialized,
then each subarray is specialized.
More precisely, if
0 < outer-dimension < (interval-dimension (array-domain array))
then array-curry returns a result as follows: If subarray-type is not
given, or is given as 'immutable, then array-curry returns
(call-with-values
(lambda () (interval-curry (array-domain array) outer-dimension))
(lambda (outer-interval inner-interval)
(array outer-interval
(lambda outer-multi-index
(array inner-interval
(lambda inner-multi-index
(apply (array-getter array) (append outer-multi-index
inner-multi-index))))))))
If subarray-type is given as 'mutable and the input array is mutable,
then array-curry returns
(call-with-values
(lambda () (interval-curry (array-domain array) outer-dimension))
(lambda (outer-interval inner-interval)
(array outer-interval
(lambda outer-multi-index
(mutable-array inner-interval
(lambda inner-multi-index
(apply (array-getter array) (append outer-multi-index
inner-multi-index)))
(lambda (v . inner-multi-index)
(apply (array-setter array) v (append outer-multi-index
inner-multi-index))))))))
And if subarray-type is given as 'specialized and the input array is
specialized, then array-curry returns
(call-with-values
(lambda () (interval-curry (specialized-array-domain array)
outer-dimension))
(lambda (outer-interval inner-interval)
(array outer-interval
(lambda outer-multi-index
(specialized-array-share array
outer-interval
(lambda inner-multi-index
(apply values (append outer-multi-index inner-multi-index))))))))
It is an error to call array-curry if its arguments do not satisfy these
conditions.