Ideas for an advanced array procedure SRFI John Cowan (11 Jan 2020 23:57 UTC)
Re: Ideas for an advanced array procedure SRFI Arthur A. Gleckler (12 Jan 2020 01:07 UTC)
Re: Ideas for an advanced array procedure SRFI John Cowan (12 Jan 2020 01:36 UTC)
Re: Ideas for an advanced array procedure SRFI Arthur A. Gleckler (12 Jan 2020 02:38 UTC)
Re: Ideas for an advanced array procedure SRFI John Cowan (12 Jan 2020 02:48 UTC)
Re: Ideas for an advanced array procedure SRFI Arthur A. Gleckler (12 Jan 2020 05:02 UTC)
Re: Ideas for an advanced array procedure SRFI Lassi Kortela (12 Jan 2020 12:36 UTC)
Re: Ideas for an advanced array procedure SRFI John Cowan (12 Jan 2020 19:26 UTC)
Re: Ideas for an advanced array procedure SRFI Lassi Kortela (13 Jan 2020 19:17 UTC)
Re: Ideas for an advanced array procedure SRFI Arthur A. Gleckler (13 Jan 2020 21:57 UTC)
Re: Ideas for an advanced array procedure SRFI Bradley Lucier (12 Jan 2020 18:11 UTC)
Re: Ideas for an advanced array procedure SRFI Bradley Lucier (26 Jan 2020 19:37 UTC)
Re: Ideas for an advanced array procedure SRFI Bradley Lucier (17 Jan 2020 00:07 UTC)
Re: Ideas for an advanced array procedure SRFI John Cowan (17 Jan 2020 03:10 UTC)
Re: Ideas for an advanced array procedure SRFI Bradley Lucier (05 May 2022 15:36 UTC)

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