Re: Ideas for an advanced array procedure SRFI Bradley Lucier 12 Jan 2020 18:11 UTC

John:

Thank you for putting together this list.

I would prefer to consider adding new procedures to SRFI-122bis as part
of the discussion of the new SRFI.

That being said, I tried my hand as implementing some of these
procedures using the updated SRFI-122.  There is still some confusion in
my mind about what the various procedures should do (I looked up the APL
document and couldn't immediately find their equivalents), here is what
I came up with (modulo proper error checking):

(define (array-fold-on proc knil a dim)
   ;; curries a, with inner dimension dim,
   ;; and folds proc on outer array elements
   (array-fold proc knil (array-curry a dim)))

;;; or

(define (array-fold-on proc knil a dim)
   ;; curries a, with inner dimension dim
   ;; and returns a new array whose elements
   ;; are fold applied to the inner arrays
   (array-map (lambda (subarray)
                (array-fold proc knil subarray))
              (array-curry a dim)))

(define (array-inner-product sum sum-knil product a1 a2)
   (let ((rotated-a2
          ;; move the first index of a2 to the end,
          ;; keeping all others the same
          (let* ((n2 (array-dimension a2))
                 (permutation (make-vector n2)))
            (do ((i 1 (fx+ i 1)))
                ((fx= i n2)
                 (vector-set! permutation (fx- n2 1) 0))
              (vector-set! permutation (fx- i 1) i))
            (array-permute a2 permutation))))
     (array-outer-product
      (lambda (sub1 sub2)
        (array-fold sum sum-knil
                    (array-map product sub1 sub2)))
      (array-curry a1 1)
      (array-curry rotated-a2 1))))

(define (recursive-array->list a)
   ;; assumes a is an array
   (define (helper a)
     ;; a need not be an array
     (if (array? a)
         (array->list
          (array-map recursive-array->list a))
         a))
   (helper a)

   (define (array-depth a)
     (if (array? a)
         (fx+ 1 (array-fold fxmax 0 (array-map array-depth a)))
         0))

This exercise suggests that (array-rotate a dim) would shorten
array-inner-product and might be more generally useful as a special case
of array-permute.  Otherwise the definitions are rather short.

Brad