Hex Artifact Content
Not logged in

Artifact 60a7c9082d74fd1640b46dc2e4269374fe9239c9:


0000: 3b 3b 3b 20 61 72 72 61 79 20 61 72 6c 69 62 0a  ;;; array arlib.
0010: 0a 3b 3b 3b 20 32 30 30 31 20 4a 75 73 73 69 20  .;;; 2001 Jussi 
0020: 50 69 69 74 75 6c 61 69 6e 65 6e 0a 0a 3b 3b 3b  Piitulainen..;;;
0030: 20 54 68 69 73 20 69 73 20 61 20 68 69 67 68 20   This is a high 
0040: 6c 65 76 65 6c 20 69 6d 70 6c 65 6d 65 6e 74 61  level implementa
0050: 74 69 6f 6e 20 6f 66 20 73 6f 6d 65 20 67 65 6e  tion of some gen
0060: 65 72 61 6c 6c 79 20 75 73 65 66 75 6c 0a 3b 3b  erally useful.;;
0070: 3b 20 61 72 72 61 79 20 70 72 6f 63 65 64 75 72  ; array procedur
0080: 65 73 2e 20 49 6e 20 61 64 64 69 74 69 6f 6e 20  es. In addition 
0090: 74 6f 20 52 35 52 53 20 61 6e 64 20 53 52 46 49  to R5RS and SRFI
00a0: 2d 32 35 2c 20 6f 6e 6c 79 20 6f 6e 65 0a 3b 3b  -25, only one.;;
00b0: 3b 20 74 6f 6f 6c 20 69 73 20 75 73 65 64 2c 20  ; tool is used, 
00c0: 6e 61 6d 65 6c 79 20 61 72 72 61 79 3a 61 70 70  namely array:app
00d0: 6c 79 2d 74 6f 2d 76 65 63 74 6f 72 20 61 6e 64  ly-to-vector and
00e0: 20 66 72 69 65 6e 64 73 2e 20 54 68 75 73 0a 3b   friends. Thus.;
00f0: 3b 3b 20 74 68 69 73 20 6c 69 62 72 61 72 79 20  ;; this library 
0100: 73 65 72 76 65 73 20 74 6f 20 70 72 6f 76 65 20  serves to prove 
0110: 74 68 61 74 20 74 68 65 20 70 72 69 6d 69 74 69  that the primiti
0120: 76 65 73 20 72 65 61 6c 6c 79 20 61 72 65 0a 3b  ves really are.;
0130: 3b 3b 20 70 72 69 6d 69 74 69 76 65 73 2e 20 2d  ;; primitives. -
0140: 20 41 20 6c 6f 77 65 72 20 6c 65 76 65 6c 20 69   A lower level i
0150: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 77 6f  mplementation wo
0160: 75 6c 64 20 61 63 63 65 73 73 20 73 6f 6d 65 0a  uld access some.
0170: 3b 3b 3b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ;;; implementati
0180: 6f 6e 20 64 65 74 61 69 6c 73 20 74 6f 20 62 79  on details to by
0190: 70 61 73 73 20 72 65 64 75 6e 64 61 6e 74 20 63  pass redundant c
01a0: 68 65 63 6b 69 6e 67 20 61 6e 64 20 73 75 63 68  hecking and such
01b0: 2e 0a 0a 3b 3b 3b 20 4e 6f 74 65 20 74 68 61 74  ...;;; Note that
01c0: 20 74 68 65 73 65 20 70 72 6f 63 65 64 75 72 65   these procedure
01d0: 73 20 61 72 65 20 6e 6f 74 20 6e 65 63 65 73 73  s are not necess
01e0: 61 72 69 6c 79 20 64 65 73 69 67 6e 65 64 20 77  arily designed w
01f0: 69 74 68 0a 3b 3b 3b 20 66 75 6c 6c 20 63 61 72  ith.;;; full car
0200: 65 2e 20 54 68 69 6e 6b 20 6f 66 20 74 68 65 6d  e. Think of them
0210: 20 61 73 20 65 78 61 6d 70 6c 65 73 20 6f 66 20   as examples of 
0220: 77 68 61 74 20 63 61 6e 20 62 65 20 64 6f 6e 65  what can be done
0230: 2e 0a 3b 3b 3b 20 49 6d 70 6f 72 74 61 6e 74 20  ..;;; Important 
0240: 74 6f 6f 6c 73 20 61 72 65 20 61 6c 73 6f 20 6d  tools are also m
0250: 69 73 73 69 6e 67 2c 20 69 6e 63 6c 75 64 69 6e  issing, includin
0260: 67 20 73 63 61 6e 73 20 61 6e 64 20 72 65 64 75  g scans and redu
0270: 63 65 73 0a 3b 3b 3b 20 61 6e 64 20 6d 61 6e 79  ces.;;; and many
0280: 20 74 68 69 6e 6b 73 20 74 68 61 74 20 49 20 68   thinks that I h
0290: 61 76 65 20 6e 6f 74 20 65 76 65 6e 20 68 65 61  ave not even hea
02a0: 72 64 20 6f 66 20 79 65 74 2e 0a 0a 3b 3b 3b 20  rd of yet...;;; 
02b0: 28 61 72 72 61 79 2d 73 68 61 70 65 20 61 72 72  (array-shape arr
02c0: 29 20 28 61 72 72 61 79 2d 6c 65 6e 67 74 68 20  ) (array-length 
02d0: 61 72 72 20 64 69 6d 29 20 28 61 72 72 61 79 2d  arr dim) (array-
02e0: 73 69 7a 65 20 61 72 72 29 0a 3b 3b 3b 20 28 61  size arr).;;; (a
02f0: 72 72 61 79 2d 65 71 75 61 6c 3f 20 61 72 72 31  rray-equal? arr1
0300: 20 61 72 72 32 29 0a 3b 3b 3b 20 28 73 68 61 70   arr2).;;; (shap
0310: 65 2d 66 6f 72 2d 65 61 63 68 20 73 68 70 20 70  e-for-each shp p
0320: 72 6f 63 20 5b 69 6e 64 5d 29 0a 3b 3b 3b 20 28  roc [ind]).;;; (
0330: 61 72 72 61 79 2d 66 6f 72 2d 65 61 63 68 2d 69  array-for-each-i
0340: 6e 64 65 78 20 61 72 72 20 70 72 6f 63 20 5b 69  ndex arr proc [i
0350: 6e 64 5d 29 0a 3b 3b 3b 20 28 74 61 62 75 6c 61  nd]).;;; (tabula
0360: 74 65 2d 61 72 72 61 79 20 73 68 70 20 70 72 6f  te-array shp pro
0370: 63 29 20 28 74 61 62 75 6c 61 74 65 2d 61 72 72  c) (tabulate-arr
0380: 61 79 21 20 73 68 70 20 70 72 6f 63 20 69 6e 64  ay! shp proc ind
0390: 29 0a 3b 3b 3b 20 28 61 72 72 61 79 2d 72 65 74  ).;;; (array-ret
03a0: 61 62 75 6c 61 74 65 21 20 61 72 72 20 73 68 70  abulate! arr shp
03b0: 20 70 72 6f 63 20 5b 69 6e 64 5d 29 0a 3b 3b 3b   proc [ind]).;;;
03c0: 20 28 61 72 72 61 79 2d 6d 61 70 20 5b 73 68 70   (array-map [shp
03d0: 5d 20 70 72 6f 63 20 61 72 72 30 20 61 72 72 31  ] proc arr0 arr1
03e0: 20 2e 2e 2e 29 0a 3b 3b 3b 20 28 61 72 72 61 79   ...).;;; (array
03f0: 2d 6d 61 70 21 20 61 72 72 20 5b 73 68 70 5d 20  -map! arr [shp] 
0400: 70 72 6f 63 20 61 72 72 30 20 61 72 72 31 20 2e  proc arr0 arr1 .
0410: 2e 2e 29 0a 3b 3b 3b 20 28 61 72 72 61 79 2d 3e  ..).;;; (array->
0420: 76 65 63 74 6f 72 20 61 72 72 29 20 28 61 72 72  vector arr) (arr
0430: 61 79 2d 3e 6c 69 73 74 20 61 72 72 29 0a 3b 3b  ay->list arr).;;
0440: 3b 20 28 73 68 61 72 65 2d 61 72 72 61 79 2f 70  ; (share-array/p
0450: 72 65 66 69 78 20 61 72 72 20 6b 20 2e 2e 2e 29  refix arr k ...)
0460: 20 28 73 68 61 72 65 2d 72 6f 77 20 61 72 72 20   (share-row arr 
0470: 6b 29 20 28 73 68 61 72 65 2d 63 6f 6c 75 6d 6e  k) (share-column
0480: 20 61 72 72 20 6b 29 0a 3b 3b 3b 20 28 73 68 61   arr k).;;; (sha
0490: 72 65 2d 61 72 72 61 79 2f 6f 72 69 67 69 6e 20  re-array/origin 
04a0: 61 72 72 20 6b 20 2e 2e 2e 29 20 28 73 68 61 72  arr k ...) (shar
04b0: 65 2d 61 72 72 61 79 2f 6f 72 69 67 69 6e 20 61  e-array/origin a
04c0: 72 72 20 69 6e 64 29 0a 3b 3b 3b 20 28 61 72 72  rr ind).;;; (arr
04d0: 61 79 2d 61 70 70 65 6e 64 20 64 69 6d 20 61 72  ay-append dim ar
04e0: 72 30 20 61 72 72 31 20 2e 2e 2e 29 0a 3b 3b 3b  r0 arr1 ...).;;;
04f0: 20 28 74 72 61 6e 73 70 6f 73 65 20 61 72 72 20   (transpose arr 
0500: 64 69 6d 20 2e 2e 2e 29 0a 3b 3b 3b 20 28 73 68  dim ...).;;; (sh
0510: 61 72 65 2d 6e 74 68 73 20 61 72 72 20 64 69 6d  are-nths arr dim
0520: 20 6e 29 0a 0a 3b 3b 3b 20 4e 61 6d 69 6e 67 20   n)..;;; Naming 
0530: 70 72 6f 62 6c 65 6d 3a 20 73 68 6f 75 6c 64 20  problem: should 
0540: 61 6c 6c 20 74 68 6f 73 65 20 69 6e 64 65 78 2d  all those index-
0550: 6f 62 6a 65 63 74 20 75 73 69 6e 67 20 70 72 6f  object using pro
0560: 63 65 64 75 72 65 73 0a 3b 3b 3b 20 62 61 6e 67  cedures.;;; bang
0570: 3f 20 54 68 65 20 6d 61 69 6e 20 61 72 67 75 6d  ? The main argum
0580: 65 6e 74 2c 20 6c 69 6b 65 20 73 68 61 70 65 2c  ent, like shape,
0590: 20 69 73 20 6e 6f 74 20 6d 75 74 61 74 65 64 2e   is not mutated.
05a0: 0a 0a 3b 3b 3b 20 28 61 72 72 61 79 2d 73 68 61  ..;;; (array-sha
05b0: 70 65 20 61 72 72 29 0a 0a 28 64 65 66 69 6e 65  pe arr)..(define
05c0: 20 28 61 72 72 61 79 2d 73 68 61 70 65 20 61 72   (array-shape ar
05d0: 72 29 0a 20 20 28 6c 65 74 20 28 28 72 20 28 61  r).  (let ((r (a
05e0: 72 72 61 79 2d 72 61 6e 6b 20 61 72 72 29 29 29  rray-rank arr)))
05f0: 0a 20 20 20 20 28 6c 65 74 20 28 28 6d 20 28 6d  .    (let ((m (m
0600: 61 6b 65 2d 61 72 72 61 79 20 28 73 68 61 70 65  ake-array (shape
0610: 20 30 20 72 20 30 20 32 29 29 29 29 0a 20 20 20   0 r 0 2)))).   
0620: 20 20 20 28 64 6f 20 28 28 64 20 30 20 28 2b 20     (do ((d 0 (+ 
0630: 64 20 31 29 29 29 0a 20 20 20 20 20 20 20 20 28  d 1))).        (
0640: 28 3d 20 64 20 72 29 0a 20 20 20 20 20 20 20 20  (= d r).        
0650: 20 6d 29 0a 20 20 20 20 20 20 20 20 28 61 72 72   m).        (arr
0660: 61 79 2d 73 65 74 21 20 6d 20 64 20 30 20 28 61  ay-set! m d 0 (a
0670: 72 72 61 79 2d 73 74 61 72 74 20 61 72 72 20 64  rray-start arr d
0680: 29 29 0a 20 20 20 20 20 20 20 20 28 61 72 72 61  )).        (arra
0690: 79 2d 73 65 74 21 20 6d 20 64 20 31 20 28 61 72  y-set! m d 1 (ar
06a0: 72 61 79 2d 65 6e 64 20 61 72 72 20 64 29 29 29  ray-end arr d)))
06b0: 29 29 29 0a 0a 3b 3b 3b 20 28 61 72 72 61 79 2d  )))..;;; (array-
06c0: 6c 65 6e 67 74 68 20 61 72 72 20 64 69 6d 29 0a  length arr dim).
06d0: 0a 28 64 65 66 69 6e 65 20 28 61 72 72 61 79 2d  .(define (array-
06e0: 6c 65 6e 67 74 68 20 61 72 72 20 64 69 6d 29 0a  length arr dim).
06f0: 20 20 28 2d 20 28 61 72 72 61 79 2d 65 6e 64 20    (- (array-end 
0700: 61 72 72 20 64 69 6d 29 0a 20 20 20 20 20 28 61  arr dim).     (a
0710: 72 72 61 79 2d 73 74 61 72 74 20 61 72 72 20 64  rray-start arr d
0720: 69 6d 29 29 29 0a 0a 3b 3b 3b 20 28 61 72 72 61  im)))..;;; (arra
0730: 79 2d 73 69 7a 65 20 61 72 72 29 0a 0a 28 64 65  y-size arr)..(de
0740: 66 69 6e 65 20 28 61 72 72 61 79 2d 73 69 7a 65  fine (array-size
0750: 20 61 72 72 29 0a 20 20 28 6c 65 74 20 28 28 72   arr).  (let ((r
0760: 20 28 61 72 72 61 79 2d 72 61 6e 6b 20 61 72 72   (array-rank arr
0770: 29 29 29 0a 20 20 20 20 28 64 6f 20 28 28 6b 20  ))).    (do ((k 
0780: 30 20 28 2b 20 6b 20 31 29 29 0a 20 20 20 20 20  0 (+ k 1)).     
0790: 20 20 20 20 28 70 20 31 20 28 2a 20 70 20 28 61      (p 1 (* p (a
07a0: 72 72 61 79 2d 6c 65 6e 67 74 68 20 61 72 72 20  rray-length arr 
07b0: 6b 29 29 29 29 0a 20 20 20 20 20 20 28 28 3d 20  k)))).      ((= 
07c0: 6b 20 72 29 20 70 29 29 29 29 0a 0a 3b 3b 3b 20  k r) p))))..;;; 
07d0: 28 61 72 72 61 79 2d 65 71 75 61 6c 3f 20 61 20  (array-equal? a 
07e0: 62 29 0a 3b 3b 3b 20 63 6f 6d 70 61 72 65 73 20  b).;;; compares 
07f0: 65 6c 65 6d 65 6e 74 73 20 77 69 74 68 20 65 71  elements with eq
0800: 75 61 6c 3f 20 73 6f 20 65 6c 65 6d 65 6e 74 73  ual? so elements
0810: 20 62 65 74 74 65 72 20 6e 6f 74 20 63 6f 6e 74   better not cont
0820: 61 69 6e 0a 3b 3b 3b 20 61 72 72 61 79 73 2e 0a  ain.;;; arrays..
0830: 0a 28 64 65 66 69 6e 65 20 28 61 72 72 61 79 2d  .(define (array-
0840: 65 71 75 61 6c 3f 20 61 20 62 29 0a 20 20 28 6c  equal? a b).  (l
0850: 65 74 20 28 28 72 20 28 61 72 72 61 79 2d 72 61  et ((r (array-ra
0860: 6e 6b 20 61 29 29 29 0a 20 20 20 20 28 61 6e 64  nk a))).    (and
0870: 20 28 3d 20 72 20 28 61 72 72 61 79 2d 72 61 6e   (= r (array-ran
0880: 6b 20 62 29 29 0a 20 20 20 20 20 20 20 20 20 28  k b)).         (
0890: 61 6e 64 20 28 64 6f 20 28 28 6b 20 30 20 28 2b  and (do ((k 0 (+
08a0: 20 6b 20 31 29 29 0a 20 20 20 20 20 20 20 20 20   k 1)).         
08b0: 20 20 20 20 20 20 20 20 20 20 28 74 72 75 65 20            (true 
08c0: 23 74 20 28 61 6e 64 20 74 72 75 65 0a 20 20 20  #t (and true.   
08d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 3d                (=
08f0: 20 28 61 72 72 61 79 2d 73 74 61 72 74 20 61 20   (array-start a 
0900: 6b 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k).             
0910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0920: 20 20 20 20 20 20 20 28 61 72 72 61 79 2d 73 74         (array-st
0930: 61 72 74 20 62 20 6b 29 29 0a 20 20 20 20 20 20  art b k)).      
0940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0950: 20 20 20 20 20 20 20 20 20 20 20 28 3d 20 28 61             (= (a
0960: 72 72 61 79 2d 65 6e 64 20 61 20 6b 29 0a 20 20  rray-end a k).  
0970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0990: 20 20 28 61 72 72 61 79 2d 65 6e 64 20 62 20 6b    (array-end b k
09a0: 29 29 29 29 29 0a 20 20 20 20 20 20 20 20 20 20  ))))).          
09b0: 20 20 20 20 20 20 28 28 3d 20 6b 20 72 29 20 74        ((= k r) t
09c0: 72 75 65 29 29 0a 20 20 20 20 20 20 20 20 20 20  rue)).          
09d0: 20 20 20 20 28 6c 65 74 20 28 28 6b 73 20 28 6d      (let ((ks (m
09e0: 61 6b 65 2d 76 65 63 74 6f 72 20 72 20 30 29 29  ake-vector r 0))
09f0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
0a00: 20 20 28 6c 65 74 20 77 6f 6b 20 28 28 64 20 30    (let wok ((d 0
0a10: 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )).             
0a20: 20 20 20 20 20 28 69 66 20 28 3c 20 64 20 72 29       (if (< d r)
0a30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0a40: 20 20 20 20 20 20 20 28 6c 65 74 20 28 28 65 20         (let ((e 
0a50: 28 61 72 72 61 79 2d 65 6e 64 20 61 20 64 29 29  (array-end a d))
0a60: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
0a70: 20 20 20 20 20 20 20 20 20 20 28 64 6f 20 28 28            (do ((
0a80: 6b 20 28 61 72 72 61 79 2d 73 74 61 72 74 20 61  k (array-start a
0a90: 20 64 29 20 28 2b 20 6b 20 31 29 29 0a 20 20 20   d) (+ k 1)).   
0aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ab0: 20 20 20 20 20 20 20 20 20 20 28 74 72 75 65 20            (true 
0ac0: 23 74 20 28 61 6e 64 20 74 72 75 65 20 28 77 6f  #t (and true (wo
0ad0: 6b 20 28 2b 20 64 20 31 29 29 29 29 29 0a 20 20  k (+ d 1))))).  
0ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0af0: 20 20 20 20 20 20 20 20 28 28 3d 20 6b 20 65 29          ((= k e)
0b00: 20 74 72 75 65 29 0a 20 20 20 20 20 20 20 20 20   true).         
0b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b20: 20 28 76 65 63 74 6f 72 2d 73 65 74 21 20 6b 73   (vector-set! ks
0b30: 20 64 20 6b 29 29 29 0a 20 20 20 20 20 20 20 20   d k))).        
0b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 65                (e
0b50: 71 75 61 6c 3f 20 28 61 72 72 61 79 2d 72 65 66  qual? (array-ref
0b60: 20 61 20 6b 73 29 0a 20 20 20 20 20 20 20 20 20   a ks).         
0b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b80: 20 20 20 20 20 28 61 72 72 61 79 2d 72 65 66 20       (array-ref 
0b90: 62 20 6b 73 29 29 29 29 29 29 29 29 29 0a 0a 3b  b ks)))))))))..;
0ba0: 3b 3b 20 28 73 68 61 70 65 2d 66 6f 72 2d 65 61  ;; (shape-for-ea
0bb0: 63 68 20 73 68 70 20 70 72 6f 63 20 5b 69 6e 64  ch shp proc [ind
0bc0: 65 78 2d 6f 62 6a 65 63 74 5d 29 0a 3b 3b 3b 20  ex-object]).;;; 
0bd0: 70 61 73 73 65 73 20 65 61 63 68 20 69 6e 64 65  passes each inde
0be0: 78 20 69 6e 20 73 68 61 70 65 20 74 6f 20 70 72  x in shape to pr
0bf0: 6f 63 20 69 6e 20 72 6f 77 2d 6d 61 6a 6f 72 20  oc in row-major 
0c00: 6f 72 64 65 72 64 2c 20 75 73 69 6e 67 0a 3b 3b  orderd, using.;;
0c10: 3b 20 69 6e 64 65 78 2d 6f 62 6a 65 63 74 20 69  ; index-object i
0c20: 66 20 70 72 6f 76 69 64 65 64 2e 0a 0a 28 64 65  f provided...(de
0c30: 66 69 6e 65 20 28 73 68 61 70 65 2d 66 6f 72 2d  fine (shape-for-
0c40: 65 61 63 68 20 73 68 70 20 70 72 6f 63 20 2e 20  each shp proc . 
0c50: 6f 29 0a 20 20 28 69 66 20 28 6e 75 6c 6c 3f 20  o).  (if (null? 
0c60: 6f 29 0a 20 20 20 20 20 20 28 61 72 72 61 79 3a  o).      (array:
0c70: 61 72 6c 69 62 3a 73 68 61 70 65 2d 66 6f 72 2d  arlib:shape-for-
0c80: 65 61 63 68 2f 61 72 67 75 6d 65 6e 74 73 20 73  each/arguments s
0c90: 68 70 20 70 72 6f 63 29 0a 20 20 20 20 20 20 28  hp proc).      (
0ca0: 69 66 20 28 76 65 63 74 6f 72 3f 20 28 63 61 72  if (vector? (car
0cb0: 20 6f 29 29 0a 20 20 20 20 20 20 20 20 20 20 28   o)).          (
0cc0: 61 72 72 61 79 3a 61 72 6c 69 62 3a 73 68 61 70  array:arlib:shap
0cd0: 65 2d 66 6f 72 2d 65 61 63 68 2f 76 65 63 74 6f  e-for-each/vecto
0ce0: 72 20 73 68 70 20 70 72 6f 63 20 28 63 61 72 20  r shp proc (car 
0cf0: 6f 29 29 0a 20 20 20 20 20 20 20 20 20 20 28 61  o)).          (a
0d00: 72 72 61 79 3a 61 72 6c 69 62 3a 73 68 61 70 65  rray:arlib:shape
0d10: 2d 66 6f 72 2d 65 61 63 68 2f 61 72 72 61 79 20  -for-each/array 
0d20: 73 68 70 20 70 72 6f 63 20 28 63 61 72 20 6f 29  shp proc (car o)
0d30: 29 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 61  ))))..(define (a
0d40: 72 72 61 79 3a 61 72 6c 69 62 3a 73 68 61 70 65  rray:arlib:shape
0d50: 2d 66 6f 72 2d 65 61 63 68 2f 61 72 67 75 6d 65  -for-each/argume
0d60: 6e 74 73 20 73 68 70 20 70 72 6f 63 29 0a 20 20  nts shp proc).  
0d70: 28 6c 65 74 20 28 28 72 20 28 61 72 72 61 79 2d  (let ((r (array-
0d80: 65 6e 64 20 73 68 70 20 30 29 29 29 0a 20 20 20  end shp 0))).   
0d90: 20 28 6c 65 74 20 28 28 76 65 63 20 28 6d 61 6b   (let ((vec (mak
0da0: 65 2d 76 65 63 74 6f 72 20 72 29 29 29 0a 20 20  e-vector r))).  
0db0: 20 20 20 20 28 6c 65 74 20 64 6f 2d 64 69 6d 20      (let do-dim 
0dc0: 28 28 64 20 30 29 29 0a 20 20 20 20 20 20 20 20  ((d 0)).        
0dd0: 28 69 66 20 28 3d 20 64 20 72 29 0a 20 20 20 20  (if (= d r).    
0de0: 20 20 20 20 20 20 20 20 28 61 72 72 61 79 3a 61          (array:a
0df0: 70 70 6c 79 2d 74 6f 2d 76 65 63 74 6f 72 20 72  pply-to-vector r
0e00: 20 70 72 6f 63 20 76 65 63 29 0a 20 20 20 20 20   proc vec).     
0e10: 20 20 20 20 20 20 20 28 6c 65 74 20 28 28 65 20         (let ((e 
0e20: 28 61 72 72 61 79 2d 72 65 66 20 73 68 70 20 64  (array-ref shp d
0e30: 20 31 29 29 29 0a 20 20 20 20 20 20 20 20 20 20   1))).          
0e40: 20 20 20 20 28 64 6f 20 28 28 6b 20 28 61 72 72      (do ((k (arr
0e50: 61 79 2d 72 65 66 20 73 68 70 20 64 20 30 29 20  ay-ref shp d 0) 
0e60: 28 2b 20 6b 20 31 29 29 29 0a 20 20 20 20 20 20  (+ k 1))).      
0e70: 20 20 20 20 20 20 20 20 20 20 28 28 3d 20 6b 20            ((= k 
0e80: 65 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  e)).            
0e90: 20 20 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21      (vector-set!
0ea0: 20 76 65 63 20 64 20 6b 29 0a 20 20 20 20 20 20   vec d k).      
0eb0: 20 20 20 20 20 20 20 20 20 20 28 64 6f 2d 64 69            (do-di
0ec0: 6d 20 28 2b 20 64 20 31 29 29 29 29 29 29 29 29  m (+ d 1))))))))
0ed0: 29 0a 0a 28 64 65 66 69 6e 65 20 28 61 72 72 61  )..(define (arra
0ee0: 79 3a 61 72 6c 69 62 3a 73 68 61 70 65 2d 66 6f  y:arlib:shape-fo
0ef0: 72 2d 65 61 63 68 2f 76 65 63 74 6f 72 20 73 68  r-each/vector sh
0f00: 70 20 70 72 6f 63 20 76 65 63 29 0a 20 20 28 6c  p proc vec).  (l
0f10: 65 74 20 28 28 72 20 28 61 72 72 61 79 2d 65 6e  et ((r (array-en
0f20: 64 20 73 68 70 20 30 29 29 29 0a 20 20 20 20 28  d shp 0))).    (
0f30: 6c 65 74 20 64 6f 2d 64 69 6d 20 28 28 64 20 30  let do-dim ((d 0
0f40: 29 29 0a 20 20 20 20 20 20 28 69 66 20 28 3d 20  )).      (if (= 
0f50: 64 20 72 29 0a 20 20 20 20 20 20 20 20 20 20 28  d r).          (
0f60: 70 72 6f 63 20 76 65 63 29 0a 20 20 20 20 20 20  proc vec).      
0f70: 20 20 20 20 28 6c 65 74 20 28 28 65 20 28 61 72      (let ((e (ar
0f80: 72 61 79 2d 72 65 66 20 73 68 70 20 64 20 31 29  ray-ref shp d 1)
0f90: 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  )).            (
0fa0: 64 6f 20 28 28 6b 20 28 61 72 72 61 79 2d 72 65  do ((k (array-re
0fb0: 66 20 73 68 70 20 64 20 30 29 20 28 2b 20 6b 20  f shp d 0) (+ k 
0fc0: 31 29 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  1))).           
0fd0: 20 20 20 28 28 3d 20 6b 20 65 29 29 0a 20 20 20     ((= k e)).   
0fe0: 20 20 20 20 20 20 20 20 20 20 20 28 76 65 63 74             (vect
0ff0: 6f 72 2d 73 65 74 21 20 76 65 63 20 64 20 6b 29  or-set! vec d k)
1000: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  .              (
1010: 64 6f 2d 64 69 6d 20 28 2b 20 64 20 31 29 29 29  do-dim (+ d 1)))
1020: 29 29 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28  )))))..(define (
1030: 61 72 72 61 79 3a 61 72 6c 69 62 3a 73 68 61 70  array:arlib:shap
1040: 65 2d 66 6f 72 2d 65 61 63 68 2f 61 72 72 61 79  e-for-each/array
1050: 20 73 68 70 20 70 72 6f 63 20 61 72 72 29 0a 20   shp proc arr). 
1060: 20 3b 3b 20 61 72 72 20 69 73 20 6e 6f 74 20 76   ;; arr is not v
1070: 65 63 74 6f 72 0a 20 20 28 6c 65 74 20 28 28 72  ector.  (let ((r
1080: 20 28 61 72 72 61 79 2d 65 6e 64 20 73 68 70 20   (array-end shp 
1090: 30 29 29 29 0a 20 20 20 20 28 6c 65 74 20 64 6f  0))).    (let do
10a0: 2d 64 69 6d 20 28 28 64 20 30 29 29 0a 20 20 20  -dim ((d 0)).   
10b0: 20 20 20 28 69 66 20 28 3d 20 64 20 72 29 0a 20     (if (= d r). 
10c0: 20 20 20 20 20 20 20 20 20 28 70 72 6f 63 20 61           (proc a
10d0: 72 72 29 0a 20 20 20 20 20 20 20 20 20 20 28 6c  rr).          (l
10e0: 65 74 20 28 28 65 20 28 61 72 72 61 79 2d 72 65  et ((e (array-re
10f0: 66 20 73 68 70 20 64 20 31 29 29 29 0a 20 20 20  f shp d 1))).   
1100: 20 20 20 20 20 20 20 20 20 28 64 6f 20 28 28 6b           (do ((k
1110: 20 28 61 72 72 61 79 2d 72 65 66 20 73 68 70 20   (array-ref shp 
1120: 64 20 30 29 20 28 2b 20 6b 20 31 29 29 29 0a 20  d 0) (+ k 1))). 
1130: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 3d               ((=
1140: 20 6b 20 65 29 29 0a 20 20 20 20 20 20 20 20 20   k e)).         
1150: 20 20 20 20 20 28 61 72 72 61 79 2d 73 65 74 21       (array-set!
1160: 20 61 72 72 20 64 20 6b 29 0a 20 20 20 20 20 20   arr d k).      
1170: 20 20 20 20 20 20 20 20 28 64 6f 2d 64 69 6d 20          (do-dim 
1180: 28 2b 20 64 20 31 29 29 29 29 29 29 29 29 0a 0a  (+ d 1))))))))..
1190: 3b 3b 3b 20 28 61 72 72 61 79 2d 66 6f 72 2d 65  ;;; (array-for-e
11a0: 61 63 68 2d 69 6e 64 65 78 20 61 72 72 20 70 72  ach-index arr pr
11b0: 6f 63 20 5b 69 6e 64 5d 29 0a 3b 3b 3b 20 69 73  oc [ind]).;;; is
11c0: 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a 3b   equivalent to.;
11d0: 3b 3b 0a 3b 3b 3b 20 20 20 28 73 68 61 70 65 2d  ;;.;;;   (shape-
11e0: 66 6f 72 2d 65 61 63 68 2d 69 6e 64 65 78 20 28  for-each-index (
11f0: 61 72 72 61 79 2d 73 68 61 70 65 20 61 72 72 29  array-shape arr)
1200: 20 70 72 6f 63 20 5b 69 6e 64 5d 29 0a 3b 3b 3b   proc [ind]).;;;
1210: 0a 3b 3b 3b 20 62 75 74 20 69 73 20 69 6d 70 6c  .;;; but is impl
1220: 65 6d 65 6e 74 65 64 20 77 69 74 68 6f 75 74 20  emented without 
1230: 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68  allocation of th
1240: 65 20 73 68 61 70 65 2c 20 74 6f 20 70 72 6f 76  e shape, to prov
1250: 65 0a 3b 3b 3b 20 74 68 61 74 20 69 74 20 63 61  e.;;; that it ca
1260: 6e 20 62 65 20 73 6f 20 69 6d 70 6c 65 6d 65 6e  n be so implemen
1270: 74 65 64 2e 0a 0a 28 64 65 66 69 6e 65 20 28 61  ted...(define (a
1280: 72 72 61 79 2d 66 6f 72 2d 65 61 63 68 2d 69 6e  rray-for-each-in
1290: 64 65 78 20 61 72 72 20 70 72 6f 63 20 2e 20 6f  dex arr proc . o
12a0: 29 0a 20 20 28 69 66 20 28 6e 75 6c 6c 3f 20 6f  ).  (if (null? o
12b0: 29 0a 20 20 20 20 20 20 28 61 72 72 61 79 3a 61  ).      (array:a
12c0: 72 6c 69 62 3a 61 72 72 61 79 2d 66 6f 72 2d 65  rlib:array-for-e
12d0: 61 63 68 2d 69 6e 64 65 78 2f 61 72 67 75 6d 65  ach-index/argume
12e0: 6e 74 73 20 61 72 72 20 70 72 6f 63 29 0a 20 20  nts arr proc).  
12f0: 20 20 20 20 28 69 66 20 28 76 65 63 74 6f 72 3f      (if (vector?
1300: 20 28 63 61 72 20 6f 29 29 0a 20 20 20 20 20 20   (car o)).      
1310: 20 20 20 20 28 61 72 72 61 79 3a 61 72 6c 69 62      (array:arlib
1320: 3a 61 72 72 61 79 2d 66 6f 72 2d 65 61 63 68 2d  :array-for-each-
1330: 69 6e 64 65 78 2f 76 65 63 74 6f 72 20 61 72 72  index/vector arr
1340: 20 70 72 6f 63 20 28 63 61 72 20 6f 29 29 0a 20   proc (car o)). 
1350: 20 20 20 20 20 20 20 20 20 28 61 72 72 61 79 3a           (array:
1360: 61 72 6c 69 62 3a 61 72 72 61 79 2d 66 6f 72 2d  arlib:array-for-
1370: 65 61 63 68 2d 69 6e 64 65 78 2f 61 72 72 61 79  each-index/array
1380: 20 61 72 72 20 70 72 6f 63 20 28 63 61 72 20 6f   arr proc (car o
1390: 29 29 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28  )))))..(define (
13a0: 61 72 72 61 79 3a 61 72 6c 69 62 3a 61 72 72 61  array:arlib:arra
13b0: 79 2d 66 6f 72 2d 65 61 63 68 2d 69 6e 64 65 78  y-for-each-index
13c0: 2f 61 72 67 75 6d 65 6e 74 73 20 61 72 72 20 70  /arguments arr p
13d0: 72 6f 63 29 0a 20 20 28 6c 65 74 20 28 28 72 20  roc).  (let ((r 
13e0: 28 61 72 72 61 79 2d 72 61 6e 6b 20 61 72 72 29  (array-rank arr)
13f0: 29 29 0a 20 20 20 20 28 6c 65 74 20 28 28 76 65  )).    (let ((ve
1400: 63 20 28 6d 61 6b 65 2d 76 65 63 74 6f 72 20 72  c (make-vector r
1410: 29 29 0a 20 20 20 20 20 20 20 20 20 20 28 61 70  )).          (ap
1420: 70 6c 79 20 28 61 72 72 61 79 3a 61 70 70 6c 69  ply (array:appli
1430: 65 72 2d 74 6f 2d 76 65 63 74 6f 72 20 72 29 29  er-to-vector r))
1440: 29 0a 20 20 20 20 20 20 28 6c 65 74 20 64 6f 2d  ).      (let do-
1450: 64 69 6d 20 28 28 64 20 30 29 29 0a 20 20 20 20  dim ((d 0)).    
1460: 20 20 20 20 28 69 66 20 28 3d 20 64 20 72 29 0a      (if (= d r).
1470: 20 20 20 20 20 20 20 20 20 20 20 20 28 61 70 70              (app
1480: 6c 79 20 70 72 6f 63 20 76 65 63 29 0a 20 20 20  ly proc vec).   
1490: 20 20 20 20 20 20 20 20 20 28 6c 65 74 20 28 28           (let ((
14a0: 65 20 28 61 72 72 61 79 2d 65 6e 64 20 61 72 72  e (array-end arr
14b0: 20 64 29 29 29 0a 20 20 20 20 20 20 20 20 20 20   d))).          
14c0: 20 20 20 20 28 64 6f 20 28 28 6b 20 28 61 72 72      (do ((k (arr
14d0: 61 79 2d 73 74 61 72 74 20 61 72 72 20 64 29 20  ay-start arr d) 
14e0: 28 2b 20 6b 20 31 29 29 29 0a 20 20 20 20 20 20  (+ k 1))).      
14f0: 20 20 20 20 20 20 20 20 20 20 28 28 3d 20 6b 20            ((= k 
1500: 65 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  e)).            
1510: 20 20 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21      (vector-set!
1520: 20 76 65 63 20 64 20 6b 29 0a 20 20 20 20 20 20   vec d k).      
1530: 20 20 20 20 20 20 20 20 20 20 28 64 6f 2d 64 69            (do-di
1540: 6d 20 28 2b 20 64 20 31 29 29 29 29 29 29 29 29  m (+ d 1))))))))
1550: 29 0a 0a 28 64 65 66 69 6e 65 20 28 61 72 72 61  )..(define (arra
1560: 79 3a 61 72 6c 69 62 3a 61 72 72 61 79 2d 66 6f  y:arlib:array-fo
1570: 72 2d 65 61 63 68 2d 69 6e 64 65 78 2f 76 65 63  r-each-index/vec
1580: 74 6f 72 20 61 72 72 20 70 72 6f 63 20 69 6e 64  tor arr proc ind
1590: 29 0a 20 20 3b 3b 20 69 6e 64 20 69 73 20 61 20  ).  ;; ind is a 
15a0: 76 65 63 74 6f 72 0a 20 20 28 6c 65 74 20 28 28  vector.  (let ((
15b0: 72 20 28 61 72 72 61 79 2d 72 61 6e 6b 20 61 72  r (array-rank ar
15c0: 72 29 29 29 0a 20 20 20 20 28 6c 65 74 20 64 6f  r))).    (let do
15d0: 2d 64 69 6d 20 28 28 64 20 30 29 29 0a 20 20 20  -dim ((d 0)).   
15e0: 20 20 20 28 69 66 20 28 3d 20 64 20 72 29 0a 20     (if (= d r). 
15f0: 20 20 20 20 20 20 20 20 20 28 70 72 6f 63 20 69           (proc i
1600: 6e 64 29 0a 20 20 20 20 20 20 20 20 20 20 28 6c  nd).          (l
1610: 65 74 20 28 28 65 20 28 61 72 72 61 79 2d 65 6e  et ((e (array-en
1620: 64 20 61 72 72 20 64 29 29 29 0a 20 20 20 20 20  d arr d))).     
1630: 20 20 20 20 20 20 20 28 64 6f 20 28 28 6b 20 28         (do ((k (
1640: 61 72 72 61 79 2d 73 74 61 72 74 20 61 72 72 20  array-start arr 
1650: 64 29 20 28 2b 20 6b 20 31 29 29 29 0a 20 20 20  d) (+ k 1))).   
1660: 20 20 20 20 20 20 20 20 20 20 20 28 28 3d 20 6b             ((= k
1670: 20 65 29 29 0a 20 20 20 20 20 20 20 20 20 20 20   e)).           
1680: 20 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21 20     (vector-set! 
1690: 69 6e 64 20 64 20 6b 29 0a 20 20 20 20 20 20 20  ind d k).       
16a0: 20 20 20 20 20 20 20 28 64 6f 2d 64 69 6d 20 28         (do-dim (
16b0: 2b 20 64 20 31 29 29 29 29 29 29 29 29 0a 0a 28  + d 1))))))))..(
16c0: 64 65 66 69 6e 65 20 28 61 72 72 61 79 3a 61 72  define (array:ar
16d0: 6c 69 62 3a 61 72 72 61 79 2d 66 6f 72 2d 65 61  lib:array-for-ea
16e0: 63 68 2d 69 6e 64 65 78 2f 61 72 72 61 79 20 61  ch-index/array a
16f0: 72 72 20 70 72 6f 63 20 69 6e 64 29 0a 20 20 3b  rr proc ind).  ;
1700: 3b 20 69 6e 64 20 69 73 20 61 6e 20 61 72 72 61  ; ind is an arra
1710: 79 20 62 75 74 20 6e 6f 74 20 61 20 76 65 63 74  y but not a vect
1720: 6f 72 0a 20 20 28 6c 65 74 20 28 28 72 20 28 61  or.  (let ((r (a
1730: 72 72 61 79 2d 72 61 6e 6b 20 61 72 72 29 29 29  rray-rank arr)))
1740: 0a 20 20 20 20 28 6c 65 74 20 64 6f 2d 64 69 6d  .    (let do-dim
1750: 20 28 28 64 20 30 29 29 0a 20 20 20 20 20 20 28   ((d 0)).      (
1760: 69 66 20 28 3d 20 64 20 72 29 0a 20 20 20 20 20  if (= d r).     
1770: 20 20 20 20 20 28 70 72 6f 63 20 69 6e 64 29 0a       (proc ind).
1780: 20 20 20 20 20 20 20 20 20 20 28 6c 65 74 20 28            (let (
1790: 28 65 20 28 61 72 72 61 79 2d 65 6e 64 20 61 72  (e (array-end ar
17a0: 72 20 64 29 29 29 0a 20 20 20 20 20 20 20 20 20  r d))).         
17b0: 20 20 20 28 64 6f 20 28 28 6b 20 28 61 72 72 61     (do ((k (arra
17c0: 79 2d 73 74 61 72 74 20 61 72 72 20 64 29 20 28  y-start arr d) (
17d0: 2b 20 6b 20 31 29 29 29 0a 20 20 20 20 20 20 20  + k 1))).       
17e0: 20 20 20 20 20 20 20 28 28 3d 20 6b 20 65 29 29         ((= k e))
17f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  .              (
1800: 61 72 72 61 79 2d 73 65 74 21 20 69 6e 64 20 64  array-set! ind d
1810: 20 6b 29 0a 20 20 20 20 20 20 20 20 20 20 20 20   k).            
1820: 20 20 28 64 6f 2d 64 69 6d 20 28 2b 20 64 20 31    (do-dim (+ d 1
1830: 29 29 29 29 29 29 29 29 0a 0a 3b 3b 3b 20 28 74  ))))))))..;;; (t
1840: 61 62 75 6c 61 74 65 2d 61 72 72 61 79 20 73 68  abulate-array sh
1850: 70 20 70 72 6f 63 29 0a 3b 3b 3b 20 28 74 61 62  p proc).;;; (tab
1860: 75 6c 61 74 65 2d 61 72 72 61 79 21 20 73 68 70  ulate-array! shp
1870: 20 70 72 6f 63 20 69 6e 64 29 0a 3b 3b 3b 20 72   proc ind).;;; r
1880: 65 74 75 72 6e 73 20 61 20 6e 65 77 6c 79 20 61  eturns a newly a
1890: 6c 6c 6f 63 61 74 65 64 20 61 72 72 61 79 20 6f  llocated array o
18a0: 66 20 74 68 65 20 67 69 76 65 6e 20 73 68 61 70  f the given shap
18b0: 65 20 77 69 74 68 20 69 6e 69 74 69 61 6c 0a 3b  e with initial.;
18c0: 3b 3b 20 63 6f 6e 74 65 6e 74 73 20 61 74 20 65  ;; contents at e
18d0: 61 63 68 20 69 6e 64 65 78 20 77 68 61 74 65 76  ach index whatev
18e0: 65 72 20 70 72 6f 63 20 72 65 74 75 72 6e 73 20  er proc returns 
18f0: 67 69 76 65 6e 20 74 68 65 20 69 6e 64 69 63 65  given the indice
1900: 73 2e 0a 3b 3b 3b 20 54 68 65 20 6c 61 74 74 65  s..;;; The latte
1910: 72 20 70 72 6f 63 65 64 75 72 65 20 72 65 75 73  r procedure reus
1920: 65 73 20 69 6e 64 20 66 6f 72 20 70 61 63 6b 61  es ind for packa
1930: 67 65 20 6f 66 20 69 6e 64 69 63 65 73 2e 0a 0a  ge of indices...
1940: 28 64 65 66 69 6e 65 20 28 74 61 62 75 6c 61 74  (define (tabulat
1950: 65 2d 61 72 72 61 79 20 73 68 70 20 70 72 6f 63  e-array shp proc
1960: 29 0a 20 20 28 6c 65 74 20 28 28 61 72 72 20 28  ).  (let ((arr (
1970: 6d 61 6b 65 2d 61 72 72 61 79 20 73 68 70 29 29  make-array shp))
1980: 29 0a 20 20 20 20 28 61 72 72 61 79 3a 61 72 6c  ).    (array:arl
1990: 69 62 3a 73 68 61 70 65 2d 66 6f 72 2d 65 61 63  ib:shape-for-eac
19a0: 68 2f 76 65 63 74 6f 72 0a 20 20 20 20 20 73 68  h/vector.     sh
19b0: 70 0a 20 20 20 20 20 28 6c 65 74 20 28 28 61 70  p.     (let ((ap
19c0: 70 6c 79 20 28 61 72 72 61 79 3a 61 70 70 6c 69  ply (array:appli
19d0: 65 72 2d 74 6f 2d 76 65 63 74 6f 72 20 28 61 72  er-to-vector (ar
19e0: 72 61 79 2d 65 6e 64 20 73 68 70 20 30 29 29 29  ray-end shp 0)))
19f0: 29 0a 20 20 20 20 20 20 20 28 6c 61 6d 62 64 61  ).       (lambda
1a00: 20 28 69 78 29 20 28 61 72 72 61 79 2d 73 65 74   (ix) (array-set
1a10: 21 20 61 72 72 20 69 78 20 28 61 70 70 6c 79 20  ! arr ix (apply 
1a20: 70 72 6f 63 20 69 78 29 29 29 29 0a 20 20 20 20  proc ix)))).    
1a30: 20 28 6d 61 6b 65 2d 76 65 63 74 6f 72 20 28 61   (make-vector (a
1a40: 72 72 61 79 2d 65 6e 64 20 73 68 70 20 30 29 29  rray-end shp 0))
1a50: 29 0a 20 20 20 20 61 72 72 29 29 0a 20 20 20 20  ).    arr)).    
1a60: 20 20 20 20 0a 28 64 65 66 69 6e 65 20 28 74 61      .(define (ta
1a70: 62 75 6c 61 74 65 2d 61 72 72 61 79 21 20 73 68  bulate-array! sh
1a80: 70 20 70 72 6f 63 20 69 6e 64 29 0a 20 20 28 6c  p proc ind).  (l
1a90: 65 74 20 28 28 61 72 72 20 28 6d 61 6b 65 2d 61  et ((arr (make-a
1aa0: 72 72 61 79 20 73 68 70 29 29 29 0a 20 20 20 20  rray shp))).    
1ab0: 28 69 66 20 28 76 65 63 74 6f 72 3f 20 69 6e 64  (if (vector? ind
1ac0: 29 0a 20 20 20 20 20 20 20 20 28 61 72 72 61 79  ).        (array
1ad0: 3a 61 72 6c 69 62 3a 73 68 61 70 65 2d 66 6f 72  :arlib:shape-for
1ae0: 2d 65 61 63 68 2f 76 65 63 74 6f 72 0a 20 20 20  -each/vector.   
1af0: 20 20 20 20 20 20 73 68 70 0a 20 20 20 20 20 20        shp.      
1b00: 20 20 20 28 6c 61 6d 62 64 61 20 28 69 78 29 20     (lambda (ix) 
1b10: 28 61 72 72 61 79 2d 73 65 74 21 20 61 72 72 20  (array-set! arr 
1b20: 69 78 20 28 70 72 6f 63 20 69 78 29 29 29 0a 20  ix (proc ix))). 
1b30: 20 20 20 20 20 20 20 20 69 6e 64 29 0a 20 20 20          ind).   
1b40: 20 20 20 20 20 28 61 72 72 61 79 3a 61 72 6c 69       (array:arli
1b50: 62 3a 73 68 61 70 65 2d 66 6f 72 2d 65 61 63 68  b:shape-for-each
1b60: 2f 61 72 72 61 79 0a 20 20 20 20 20 20 20 20 20  /array.         
1b70: 73 68 70 0a 20 20 20 20 20 20 20 20 20 28 6c 61  shp.         (la
1b80: 6d 62 64 61 20 28 69 78 29 20 28 61 72 72 61 79  mbda (ix) (array
1b90: 2d 73 65 74 21 20 61 72 72 20 69 78 20 28 70 72  -set! arr ix (pr
1ba0: 6f 63 20 69 78 29 29 29 0a 20 20 20 20 20 20 20  oc ix))).       
1bb0: 20 20 69 6e 64 29 29 0a 20 20 20 20 61 72 72 29    ind)).    arr)
1bc0: 29 0a 0a 3b 3b 3b 20 28 61 72 72 61 79 2d 72 65  )..;;; (array-re
1bd0: 74 61 62 75 6c 61 74 65 21 20 61 72 72 20 73 68  tabulate! arr sh
1be0: 70 20 70 72 6f 63 20 5b 69 6e 64 65 78 2d 6f 62  p proc [index-ob
1bf0: 6a 65 63 74 5d 29 0a 3b 3b 3b 20 73 65 74 73 20  ject]).;;; sets 
1c00: 74 68 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20  the elements of 
1c10: 61 72 72 20 69 6e 20 73 68 61 70 65 20 74 6f 20  arr in shape to 
1c20: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 70 72 6f  the value of pro
1c30: 63 20 61 74 20 74 68 61 74 0a 3b 3b 3b 20 69 6e  c at that.;;; in
1c40: 64 65 78 2c 20 75 73 69 6e 67 20 69 6e 64 65 78  dex, using index
1c50: 2d 6f 62 6a 65 63 74 20 69 66 20 70 72 6f 76 69  -object if provi
1c60: 64 65 64 2e 0a 0a 28 64 65 66 69 6e 65 20 28 61  ded...(define (a
1c70: 72 72 61 79 2d 72 65 74 61 62 75 6c 61 74 65 21  rray-retabulate!
1c80: 20 61 72 72 20 73 68 70 20 70 72 6f 63 20 2e 20   arr shp proc . 
1c90: 6f 29 0a 20 20 28 69 66 20 28 6e 75 6c 6c 3f 20  o).  (if (null? 
1ca0: 6f 29 0a 20 20 20 20 20 20 28 61 72 72 61 79 3a  o).      (array:
1cb0: 61 72 6c 69 62 3a 73 68 61 70 65 2d 66 6f 72 2d  arlib:shape-for-
1cc0: 65 61 63 68 2f 76 65 63 74 6f 72 0a 20 20 20 20  each/vector.    
1cd0: 20 20 20 73 68 70 0a 20 20 20 20 20 20 20 28 6c     shp.       (l
1ce0: 65 74 20 28 28 61 70 70 6c 79 20 28 61 72 72 61  et ((apply (arra
1cf0: 79 3a 61 70 70 6c 69 65 72 2d 74 6f 2d 76 65 63  y:applier-to-vec
1d00: 74 6f 72 20 28 61 72 72 61 79 2d 65 6e 64 20 73  tor (array-end s
1d10: 68 70 20 30 29 29 29 29 0a 20 20 20 20 20 20 20  hp 0)))).       
1d20: 20 20 28 6c 61 6d 62 64 61 20 28 69 78 29 0a 20    (lambda (ix). 
1d30: 20 20 20 20 20 20 20 20 20 20 28 61 72 72 61 79            (array
1d40: 2d 73 65 74 21 20 61 72 72 20 69 78 20 28 61 70  -set! arr ix (ap
1d50: 70 6c 79 20 70 72 6f 63 20 69 78 29 29 29 29 0a  ply proc ix)))).
1d60: 20 20 20 20 20 20 20 28 6d 61 6b 65 2d 76 65 63         (make-vec
1d70: 74 6f 72 20 28 61 72 72 61 79 2d 65 6e 64 20 73  tor (array-end s
1d80: 68 70 20 30 29 29 29 0a 20 20 20 20 20 20 28 69  hp 0))).      (i
1d90: 66 20 28 76 65 63 74 6f 72 3f 20 28 63 61 72 20  f (vector? (car 
1da0: 6f 29 29 0a 20 20 20 20 20 20 20 20 20 20 28 61  o)).          (a
1db0: 72 72 61 79 3a 61 72 6c 69 62 3a 73 68 61 70 65  rray:arlib:shape
1dc0: 2d 66 6f 72 2d 65 61 63 68 2f 76 65 63 74 6f 72  -for-each/vector
1dd0: 0a 20 20 20 20 20 20 20 20 20 20 20 73 68 70 0a  .           shp.
1de0: 20 20 20 20 20 20 20 20 20 20 20 28 6c 61 6d 62             (lamb
1df0: 64 61 20 28 69 78 29 0a 20 20 20 20 20 20 20 20  da (ix).        
1e00: 20 20 20 20 20 28 61 72 72 61 79 2d 73 65 74 21       (array-set!
1e10: 20 61 72 72 20 69 78 20 28 70 72 6f 63 20 69 78   arr ix (proc ix
1e20: 29 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 28  ))).           (
1e30: 63 61 72 20 6f 29 29 0a 20 20 20 20 20 20 20 20  car o)).        
1e40: 20 20 28 61 72 72 61 79 3a 61 72 6c 69 62 3a 73    (array:arlib:s
1e50: 68 61 70 65 2d 66 6f 72 2d 65 61 63 68 2f 61 72  hape-for-each/ar
1e60: 72 61 79 0a 20 20 20 20 20 20 20 20 20 20 20 73  ray.           s
1e70: 68 70 0a 20 20 20 20 20 20 20 20 20 20 20 28 6c  hp.           (l
1e80: 61 6d 62 64 61 20 28 69 78 29 0a 20 20 20 20 20  ambda (ix).     
1e90: 20 20 20 20 20 20 20 20 28 61 72 72 61 79 2d 73          (array-s
1ea0: 65 74 21 20 61 72 72 20 69 78 20 28 70 72 6f 63  et! arr ix (proc
1eb0: 20 69 78 29 29 29 0a 20 20 20 20 20 20 20 20 20   ix))).         
1ec0: 20 20 28 63 61 72 20 6f 29 29 29 29 29 0a 0a 3b    (car o)))))..;
1ed0: 3b 3b 20 28 61 72 72 61 79 2d 6d 61 70 21 20 61  ;; (array-map! a
1ee0: 72 72 61 79 20 5b 73 68 61 70 65 5d 20 70 72 6f  rray [shape] pro
1ef0: 63 20 61 72 72 61 79 30 20 61 72 72 61 79 31 2e  c array0 array1.
1f00: 2e 2e 29 0a 3b 3b 3b 20 73 74 6f 72 65 73 20 74  ..).;;; stores t
1f10: 6f 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 20 6f  o the elements o
1f20: 66 20 61 72 72 61 79 20 28 69 6e 20 73 68 61 70  f array (in shap
1f30: 65 29 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66  e) the values of
1f40: 20 70 72 6f 63 20 61 74 0a 3b 3b 3b 20 74 68 65   proc at.;;; the
1f50: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 72 72   contents of arr
1f60: 61 79 6b 20 61 74 20 63 6f 72 72 65 73 70 6f 6e  ayk at correspon
1f70: 64 69 6e 67 20 69 6e 64 65 78 2e 0a 0a 28 64 65  ding index...(de
1f80: 66 69 6e 65 20 28 61 72 72 61 79 2d 6d 61 70 21  fine (array-map!
1f90: 20 61 72 72 20 78 20 79 20 2e 20 6f 29 0a 20 20   arr x y . o).  
1fa0: 28 69 66 20 28 61 72 72 61 79 3a 61 72 72 61 79  (if (array:array
1fb0: 3f 20 78 29 0a 20 20 20 20 20 20 28 61 72 72 61  ? x).      (arra
1fc0: 79 3a 61 72 6c 69 62 3a 6d 61 70 21 20 61 72 72  y:arlib:map! arr
1fd0: 20 78 20 79 20 28 61 70 70 6c 79 20 76 65 63 74   x y (apply vect
1fe0: 6f 72 20 6f 29 29 0a 20 20 20 20 20 20 28 61 72  or o)).      (ar
1ff0: 72 61 79 3a 61 72 6c 69 62 3a 6d 61 70 21 20 61  ray:arlib:map! a
2000: 72 72 20 28 61 72 72 61 79 2d 73 68 61 70 65 20  rr (array-shape 
2010: 61 72 72 29 20 78 20 28 61 70 70 6c 79 20 76 65  arr) x (apply ve
2020: 63 74 6f 72 20 79 20 6f 29 29 29 29 0a 0a 28 64  ctor y o))))..(d
2030: 65 66 69 6e 65 20 28 61 72 72 61 79 3a 61 72 6c  efine (array:arl
2040: 69 62 3a 6d 61 70 21 20 61 72 72 20 73 68 70 20  ib:map! arr shp 
2050: 70 72 6f 63 20 61 72 67 73 29 0a 20 20 28 6c 65  proc args).  (le
2060: 74 20 28 28 72 61 6e 6b 20 28 76 65 63 74 6f 72  t ((rank (vector
2070: 2d 6c 65 6e 67 74 68 20 61 72 67 73 29 29 29 0a  -length args))).
2080: 20 20 20 20 28 6c 65 74 20 28 28 61 72 67 76 20      (let ((argv 
2090: 28 6d 61 6b 65 2d 76 65 63 74 6f 72 20 72 61 6e  (make-vector ran
20a0: 6b 29 29 29 0a 20 20 20 20 20 20 28 61 72 72 61  k))).      (arra
20b0: 79 3a 61 72 6c 69 62 3a 73 68 61 70 65 2d 66 6f  y:arlib:shape-fo
20c0: 72 2d 65 61 63 68 2f 76 65 63 74 6f 72 0a 20 20  r-each/vector.  
20d0: 20 20 20 20 20 73 68 70 0a 20 20 20 20 20 20 20       shp.       
20e0: 28 6c 65 74 20 28 28 61 70 70 6c 79 20 28 61 72  (let ((apply (ar
20f0: 72 61 79 3a 61 70 70 6c 69 65 72 2d 74 6f 2d 76  ray:applier-to-v
2100: 65 63 74 6f 72 20 72 61 6e 6b 29 29 29 0a 20 20  ector rank))).  
2110: 20 20 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28         (lambda (
2120: 69 78 29 0a 20 20 20 20 20 20 20 20 20 20 20 28  ix).           (
2130: 64 6f 20 28 28 6b 20 30 20 28 2b 20 6b 20 31 29  do ((k 0 (+ k 1)
2140: 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )).             
2150: 28 28 3d 20 6b 20 72 61 6e 6b 29 29 0a 20 20 20  ((= k rank)).   
2160: 20 20 20 20 20 20 20 20 20 20 28 76 65 63 74 6f            (vecto
2170: 72 2d 73 65 74 21 20 61 72 67 76 20 6b 20 28 61  r-set! argv k (a
2180: 72 72 61 79 2d 72 65 66 20 28 76 65 63 74 6f 72  rray-ref (vector
2190: 2d 72 65 66 20 61 72 67 73 20 6b 29 20 69 78 29  -ref args k) ix)
21a0: 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 28 61  )).           (a
21b0: 72 72 61 79 2d 73 65 74 21 20 61 72 72 20 69 78  rray-set! arr ix
21c0: 20 28 61 70 70 6c 79 20 70 72 6f 63 20 61 72 67   (apply proc arg
21d0: 76 29 29 29 29 0a 20 20 20 20 20 20 20 28 6d 61  v)))).       (ma
21e0: 6b 65 2d 76 65 63 74 6f 72 20 28 61 72 72 61 79  ke-vector (array
21f0: 2d 65 6e 64 20 73 68 70 20 30 29 29 29 29 29 29  -end shp 0))))))
2200: 0a 0a 3b 3b 3b 20 28 61 72 72 61 79 2d 6d 61 70  ..;;; (array-map
2210: 20 5b 73 68 61 70 65 5d 20 70 72 6f 63 20 61 72   [shape] proc ar
2220: 72 61 79 30 20 61 72 72 61 79 31 20 2e 2e 2e 29  ray0 array1 ...)
2230: 0a 3b 3b 3b 20 63 72 65 61 74 65 73 20 61 20 6e  .;;; creates a n
2240: 65 77 20 61 72 72 61 79 20 77 69 74 68 20 65 6c  ew array with el
2250: 65 6d 65 6e 74 73 20 69 6e 69 74 69 61 6c 69 7a  ements initializ
2260: 65 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65 73  ed to the values
2270: 20 6f 66 0a 3b 3b 3b 20 70 72 6f 63 20 61 74 20   of.;;; proc at 
2280: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 72 72 61  contents of arra
2290: 79 6b 20 28 69 6e 20 73 68 61 70 65 29 2e 0a 0a  yk (in shape)...
22a0: 28 64 65 66 69 6e 65 20 28 61 72 72 61 79 2d 6d  (define (array-m
22b0: 61 70 20 78 20 79 20 2e 20 6f 29 0a 20 20 28 69  ap x y . o).  (i
22c0: 66 20 28 61 72 72 61 79 3a 61 72 72 61 79 3f 20  f (array:array? 
22d0: 78 29 0a 20 20 20 20 20 20 28 6c 65 74 20 28 28  x).      (let ((
22e0: 61 72 72 20 28 6d 61 6b 65 2d 61 72 72 61 79 20  arr (make-array 
22f0: 78 29 29 29 0a 20 20 20 20 20 20 20 20 28 61 72  x))).        (ar
2300: 72 61 79 3a 61 72 6c 69 62 3a 6d 61 70 21 20 61  ray:arlib:map! a
2310: 72 72 20 78 20 79 20 28 61 70 70 6c 79 20 76 65  rr x y (apply ve
2320: 63 74 6f 72 20 6f 29 29 0a 20 20 20 20 20 20 20  ctor o)).       
2330: 20 61 72 72 29 0a 20 20 20 20 20 20 28 6c 65 74   arr).      (let
2340: 20 28 28 73 68 70 20 28 61 72 72 61 79 2d 73 68   ((shp (array-sh
2350: 61 70 65 20 79 29 29 29 0a 20 20 20 20 20 20 20  ape y))).       
2360: 20 28 6c 65 74 20 28 28 61 72 72 20 28 6d 61 6b   (let ((arr (mak
2370: 65 2d 61 72 72 61 79 20 73 68 70 29 29 29 0a 20  e-array shp))). 
2380: 20 20 20 20 20 20 20 20 20 28 61 72 72 61 79 3a           (array:
2390: 61 72 6c 69 62 3a 6d 61 70 21 20 61 72 72 20 73  arlib:map! arr s
23a0: 68 70 20 78 20 28 61 70 70 6c 79 20 76 65 63 74  hp x (apply vect
23b0: 6f 72 20 79 20 6f 29 29 0a 20 20 20 20 20 20 20  or y o)).       
23c0: 20 20 20 61 72 72 29 29 29 29 0a 0a 3b 3b 3b 20     arr))))..;;; 
23d0: 53 52 46 49 2d 32 35 20 6d 61 69 6c 69 6e 67 20  SRFI-25 mailing 
23e0: 6c 69 73 74 20 72 65 71 75 65 73 74 65 64 20 61  list requested a
23f0: 72 72 61 79 2d 3e 76 65 63 74 6f 72 3b 20 74 68  rray->vector; th
2400: 65 79 20 61 6c 73 6f 20 72 65 71 75 65 73 74 65  ey also requeste
2410: 64 20 74 68 65 0a 3b 3b 3b 20 61 62 69 6c 69 74  d the.;;; abilit
2420: 79 20 74 6f 20 75 73 65 20 61 6e 20 61 72 72 61  y to use an arra
2430: 79 20 61 73 20 61 6e 20 69 6e 64 65 78 20 6f 66  y as an index of
2440: 20 61 6e 20 65 6c 65 6d 65 6e 74 2c 20 61 6e 64   an element, and
2450: 20 61 72 72 61 79 2d 3e 6c 69 73 74 20 69 73 0a   array->list is.
2460: 3b 3b 3b 20 61 6e 20 61 74 74 65 6d 70 74 20 74  ;;; an attempt t
2470: 6f 20 70 72 6f 76 69 64 65 20 66 6f 72 20 74 68  o provide for th
2480: 61 74 2e 0a 0a 28 64 65 66 69 6e 65 20 28 61 72  at...(define (ar
2490: 72 61 79 2d 3e 76 65 63 74 6f 72 20 61 72 72 29  ray->vector arr)
24a0: 0a 20 20 28 6c 65 74 20 28 28 76 65 63 20 28 6d  .  (let ((vec (m
24b0: 61 6b 65 2d 76 65 63 74 6f 72 20 28 61 72 72 61  ake-vector (arra
24c0: 79 2d 73 69 7a 65 20 61 72 72 29 29 29 29 0a 20  y-size arr)))). 
24d0: 20 20 20 28 6c 65 74 20 28 28 6b 20 30 29 29 0a     (let ((k 0)).
24e0: 20 20 20 20 20 20 28 73 68 61 70 65 2d 66 6f 72        (shape-for
24f0: 2d 65 61 63 68 0a 20 20 20 20 20 20 20 28 61 72  -each.       (ar
2500: 72 61 79 2d 73 68 61 70 65 20 61 72 72 29 0a 20  ray-shape arr). 
2510: 20 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 69        (lambda (i
2520: 6e 64 65 78 29 0a 20 20 20 20 20 20 20 20 20 28  ndex).         (
2530: 76 65 63 74 6f 72 2d 73 65 74 21 20 76 65 63 20  vector-set! vec 
2540: 6b 20 28 61 72 72 61 79 2d 72 65 66 20 61 72 72  k (array-ref arr
2550: 20 69 6e 64 65 78 29 29 0a 20 20 20 20 20 20 20   index)).       
2560: 20 20 28 73 65 74 21 20 6b 20 28 2b 20 6b 20 31    (set! k (+ k 1
2570: 29 29 29 0a 20 20 20 20 20 20 20 28 6d 61 6b 65  ))).       (make
2580: 2d 76 65 63 74 6f 72 20 28 61 72 72 61 79 2d 72  -vector (array-r
2590: 61 6e 6b 20 61 72 72 29 29 29 0a 20 20 20 20 20  ank arr))).     
25a0: 20 76 65 63 29 29 29 0a 0a 3b 3b 3b 20 49 74 20   vec)))..;;; It 
25b0: 6e 65 65 64 73 20 74 6f 20 62 65 20 73 61 69 64  needs to be said
25c0: 20 74 68 61 74 20 6d 6f 72 65 20 65 66 66 69 63   that more effic
25d0: 69 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74  ient implementat
25e0: 69 6f 6e 73 20 61 72 65 0a 3b 3b 3b 20 70 6f 73  ions are.;;; pos
25f0: 73 69 62 6c 65 2c 20 65 76 65 6e 20 77 69 74 68  sible, even with
2600: 69 6e 20 53 52 46 49 2d 32 35 2e 0a 0a 28 64 65  in SRFI-25...(de
2610: 66 69 6e 65 20 28 61 72 72 61 79 2d 3e 6c 69 73  fine (array->lis
2620: 74 20 61 72 72 29 0a 20 20 28 76 65 63 74 6f 72  t arr).  (vector
2630: 2d 3e 6c 69 73 74 20 28 61 72 72 61 79 2d 3e 76  ->list (array->v
2640: 65 63 74 6f 72 20 61 72 72 29 29 29 0a 0a 3b 3b  ector arr)))..;;
2650: 3b 20 28 73 68 61 72 65 2d 72 6f 77 20 61 72 72  ; (share-row arr
2660: 20 6b 29 0a 3b 3b 3b 20 73 68 61 72 65 73 20 77   k).;;; shares w
2670: 68 61 74 65 76 65 72 20 74 68 65 20 66 69 72 73  hatever the firs
2680: 74 20 69 6e 64 65 78 20 69 73 20 61 62 6f 75 74  t index is about
2690: 2e 0a 3b 3b 3b 20 54 68 65 20 72 65 73 75 6c 74  ..;;; The result
26a0: 20 68 61 73 20 6f 6e 65 20 64 69 6d 65 6e 73 69   has one dimensi
26b0: 6f 6e 20 6c 65 73 73 2e 0a 0a 28 64 65 66 69 6e  on less...(defin
26c0: 65 20 28 73 68 61 72 65 2d 72 6f 77 20 61 72 72  e (share-row arr
26d0: 20 6b 29 0a 20 20 28 73 68 61 72 65 2d 61 72 72   k).  (share-arr
26e0: 61 79 0a 20 20 20 61 72 72 0a 20 20 20 28 6c 65  ay.   arr.   (le
26f0: 74 20 28 28 62 6f 75 6e 64 73 20 28 61 72 72 61  t ((bounds (arra
2700: 79 2d 3e 6c 69 73 74 20 28 61 72 72 61 79 2d 73  y->list (array-s
2710: 68 61 70 65 20 61 72 72 29 29 29 29 0a 20 20 20  hape arr)))).   
2720: 20 20 28 61 70 70 6c 79 20 73 68 61 70 65 20 28    (apply shape (
2730: 63 64 64 72 20 62 6f 75 6e 64 73 29 29 29 0a 20  cddr bounds))). 
2740: 20 20 28 6c 61 6d 62 64 61 20 6b 73 0a 20 20 20    (lambda ks.   
2750: 20 20 28 61 70 70 6c 79 20 76 61 6c 75 65 73 20    (apply values 
2760: 6b 20 6b 73 29 29 29 29 0a 0a 3b 3b 3b 20 28 73  k ks))))..;;; (s
2770: 68 61 72 65 2d 61 72 72 61 79 2f 70 72 65 66 69  hare-array/prefi
2780: 78 20 61 72 72 20 6b 20 2e 2e 2e 29 0a 0a 28 64  x arr k ...)..(d
2790: 65 66 69 6e 65 20 28 73 68 61 72 65 2d 61 72 72  efine (share-arr
27a0: 61 79 2f 70 72 65 66 69 78 20 61 72 72 20 2e 20  ay/prefix arr . 
27b0: 6a 73 29 0a 20 20 28 69 66 20 28 6f 72 20 28 6e  js).  (if (or (n
27c0: 75 6c 6c 3f 20 6a 73 29 0a 20 20 20 20 20 20 20  ull? js).       
27d0: 20 20 20 28 69 6e 74 65 67 65 72 3f 20 28 63 61     (integer? (ca
27e0: 72 20 6a 73 29 29 29 0a 20 20 20 20 20 20 28 73  r js))).      (s
27f0: 68 61 72 65 2d 61 72 72 61 79 0a 20 20 20 20 20  hare-array.     
2800: 20 20 61 72 72 0a 20 20 20 20 20 20 20 28 6c 65    arr.       (le
2810: 74 20 28 28 62 6f 75 6e 64 73 20 28 61 72 72 61  t ((bounds (arra
2820: 79 2d 3e 6c 69 73 74 20 28 61 72 72 61 79 2d 73  y->list (array-s
2830: 68 61 70 65 20 61 72 72 29 29 29 29 0a 20 20 20  hape arr)))).   
2840: 20 20 20 20 20 20 28 61 70 70 6c 79 20 73 68 61        (apply sha
2850: 70 65 20 28 6c 69 73 74 2d 74 61 69 6c 20 62 6f  pe (list-tail bo
2860: 75 6e 64 73 20 28 2a 20 32 20 28 6c 65 6e 67 74  unds (* 2 (lengt
2870: 68 20 6a 73 29 29 29 29 29 0a 20 20 20 20 20 20  h js))))).      
2880: 20 28 6c 61 6d 62 64 61 20 6b 73 0a 20 20 20 20   (lambda ks.    
2890: 20 20 20 20 20 28 61 70 70 6c 79 20 76 61 6c 75       (apply valu
28a0: 65 73 20 28 61 70 70 65 6e 64 20 6a 73 20 6b 73  es (append js ks
28b0: 29 29 29 29 0a 20 20 20 20 20 20 28 61 70 70 6c  )))).      (appl
28c0: 79 20 28 6c 61 6d 62 64 61 20 28 66 69 78 29 0a  y (lambda (fix).
28d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
28e0: 73 68 61 72 65 2d 61 72 72 61 79 2f 70 72 65 66  share-array/pref
28f0: 69 78 21 0a 20 20 20 20 20 20 20 20 20 20 20 20  ix!.            
2900: 20 20 20 20 61 72 72 0a 20 20 20 20 20 20 20 20      arr.        
2910: 20 20 20 20 20 20 20 20 66 69 78 0a 20 20 20 20          fix.    
2920: 20 20 20 20 20 20 20 20 20 20 20 20 28 6d 61 6b              (mak
2930: 65 2d 76 65 63 74 6f 72 20 28 2d 20 28 61 72 72  e-vector (- (arr
2940: 61 79 2d 72 61 6e 6b 20 61 72 72 29 0a 20 20 20  ay-rank arr).   
2950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2960: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 66               (if
2970: 20 28 76 65 63 74 6f 72 3f 20 66 69 78 29 0a 20   (vector? fix). 
2980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a0: 20 20 20 28 76 65 63 74 6f 72 2d 6c 65 6e 67 74     (vector-lengt
29b0: 68 20 66 69 78 29 0a 20 20 20 20 20 20 20 20 20  h fix).         
29c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d0: 20 20 20 20 20 20 20 20 20 20 20 28 61 72 72 61             (arra
29e0: 79 2d 65 6e 64 20 66 69 78 20 30 29 29 29 29 29  y-end fix 0)))))
29f0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 6a  ).             j
2a00: 73 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 73  s)))..(define (s
2a10: 68 61 72 65 2d 61 72 72 61 79 2f 70 72 65 66 69  hare-array/prefi
2a20: 78 21 20 61 72 72 20 66 69 78 20 69 6e 20 2e 20  x! arr fix in . 
2a30: 6f 75 74 29 0a 20 20 28 6c 65 74 2a 20 28 28 6f  out).  (let* ((o
2a40: 75 74 20 28 69 66 20 28 70 61 69 72 3f 20 6f 75  ut (if (pair? ou
2a50: 74 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t).             
2a60: 20 20 20 20 20 28 28 6c 61 6d 62 64 61 20 28 6f       ((lambda (o
2a70: 75 74 29 20 6f 75 74 29 20 6f 75 74 29 0a 20 20  ut) out) out).  
2a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a90: 28 6d 61 6b 65 2d 76 65 63 74 6f 72 20 28 61 72  (make-vector (ar
2aa0: 72 61 79 2d 72 61 6e 6b 20 61 72 72 29 29 29 29  ray-rank arr))))
2ab0: 0a 20 20 20 20 20 20 20 20 20 28 66 69 78 2d 72  .         (fix-r
2ac0: 65 66 20 28 69 66 20 28 76 65 63 74 6f 72 3f 20  ef (if (vector? 
2ad0: 66 69 78 29 20 76 65 63 74 6f 72 2d 72 65 66 20  fix) vector-ref 
2ae0: 61 72 72 61 79 2d 72 65 66 29 29 0a 20 20 20 20  array-ref)).    
2af0: 20 20 20 20 20 28 69 6e 2d 72 65 66 20 28 69 66       (in-ref (if
2b00: 20 28 76 65 63 74 6f 72 3f 20 69 6e 29 20 76 65   (vector? in) ve
2b10: 63 74 6f 72 2d 72 65 66 20 61 72 72 61 79 2d 72  ctor-ref array-r
2b20: 65 66 29 29 0a 20 20 20 20 20 20 20 20 20 28 6f  ef)).         (o
2b30: 75 74 2d 73 65 74 21 20 28 69 66 20 28 76 65 63  ut-set! (if (vec
2b40: 74 6f 72 3f 20 6f 75 74 29 20 76 65 63 74 6f 72  tor? out) vector
2b50: 2d 73 65 74 21 20 61 72 72 61 79 2d 73 65 74 21  -set! array-set!
2b60: 29 29 0a 20 20 20 20 20 20 20 20 20 28 6d 20 28  )).         (m (
2b70: 69 66 20 28 76 65 63 74 6f 72 3f 20 66 69 78 29  if (vector? fix)
2b80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2b90: 20 28 76 65 63 74 6f 72 2d 6c 65 6e 67 74 68 20   (vector-length 
2ba0: 66 69 78 29 0a 20 20 20 20 20 20 20 20 20 20 20  fix).           
2bb0: 20 20 20 20 20 28 61 72 72 61 79 2d 65 6e 64 20       (array-end 
2bc0: 66 69 78 20 30 29 29 29 0a 20 20 20 20 20 20 20  fix 0))).       
2bd0: 20 20 28 6e 20 28 69 66 20 28 76 65 63 74 6f 72    (n (if (vector
2be0: 3f 20 6f 75 74 29 0a 20 20 20 20 20 20 20 20 20  ? out).         
2bf0: 20 20 20 20 20 20 20 28 76 65 63 74 6f 72 2d 6c         (vector-l
2c00: 65 6e 67 74 68 20 6f 75 74 29 0a 20 20 20 20 20  ength out).     
2c10: 20 20 20 20 20 20 20 20 20 20 20 28 61 72 72 61             (arra
2c20: 79 2d 65 6e 64 20 6f 75 74 20 30 29 29 29 29 0a  y-end out 0)))).
2c30: 20 20 20 20 28 64 6f 20 28 28 6b 20 30 20 28 2b      (do ((k 0 (+
2c40: 20 6b 20 31 29 29 29 0a 20 20 20 20 20 20 28 28   k 1))).      ((
2c50: 3d 20 6b 20 6d 29 29 0a 20 20 20 20 20 20 28 6f  = k m)).      (o
2c60: 75 74 2d 73 65 74 21 20 6f 75 74 20 6b 20 28 66  ut-set! out k (f
2c70: 69 78 2d 72 65 66 20 66 69 78 20 6b 29 29 29 0a  ix-ref fix k))).
2c80: 20 20 20 20 28 73 68 61 72 65 2d 61 72 72 61 79      (share-array
2c90: 2f 69 6e 64 65 78 21 0a 20 20 20 20 20 61 72 72  /index!.     arr
2ca0: 0a 20 20 20 20 20 28 6c 65 74 20 28 28 62 6f 75  .     (let ((bou
2cb0: 6e 64 73 20 28 61 72 72 61 79 2d 3e 6c 69 73 74  nds (array->list
2cc0: 20 28 61 72 72 61 79 2d 73 68 61 70 65 20 61 72   (array-shape ar
2cd0: 72 29 29 29 29 0a 20 20 20 20 20 20 20 28 61 70  r)))).       (ap
2ce0: 70 6c 79 20 73 68 61 70 65 20 28 6c 69 73 74 2d  ply shape (list-
2cf0: 74 61 69 6c 20 62 6f 75 6e 64 73 20 28 69 66 20  tail bounds (if 
2d00: 28 76 65 63 74 6f 72 3f 20 66 69 78 29 0a 20 20  (vector? fix).  
2d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d30: 20 20 20 20 20 20 20 20 28 2a 20 32 20 28 76 65          (* 2 (ve
2d40: 63 74 6f 72 2d 6c 65 6e 67 74 68 20 66 69 78 29  ctor-length fix)
2d50: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
2d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d70: 20 20 20 20 20 20 20 20 20 20 20 20 28 2a 20 32              (* 2
2d80: 20 28 61 72 72 61 79 2d 65 6e 64 20 66 69 78 20   (array-end fix 
2d90: 30 29 29 29 29 29 29 0a 20 20 20 20 20 28 6c 61  0)))))).     (la
2da0: 6d 62 64 61 20 28 69 6e 29 0a 20 20 20 20 20 20  mbda (in).      
2db0: 20 28 64 6f 20 28 28 6b 20 6d 20 28 2b 20 6b 20   (do ((k m (+ k 
2dc0: 31 29 29 29 0a 20 20 20 20 20 20 20 20 20 28 28  1))).         ((
2dd0: 3d 20 6b 20 6e 29 29 0a 20 20 20 20 20 20 20 20  = k n)).        
2de0: 20 28 6f 75 74 2d 73 65 74 21 20 6f 75 74 20 6b   (out-set! out k
2df0: 20 28 69 6e 2d 72 65 66 20 69 6e 20 28 2d 20 6b   (in-ref in (- k
2e00: 20 6d 29 29 29 29 0a 20 20 20 20 20 20 20 6f 75   m)))).       ou
2e10: 74 29 0a 20 20 20 20 20 69 6e 29 29 29 0a 0a 3b  t).     in)))..;
2e20: 3b 3b 20 28 73 68 61 72 65 2d 63 6f 6c 75 6d 6e  ;; (share-column
2e30: 20 61 72 72 20 6b 29 0a 3b 3b 3b 20 73 68 61 72   arr k).;;; shar
2e40: 65 73 20 77 68 61 74 65 76 65 72 20 74 68 65 20  es whatever the 
2e50: 73 65 63 6f 6e 64 20 69 6e 64 65 78 20 69 73 20  second index is 
2e60: 61 62 6f 75 74 2e 0a 3b 3b 3b 20 54 68 65 20 72  about..;;; The r
2e70: 65 73 75 6c 74 20 68 61 73 20 6f 6e 65 20 64 69  esult has one di
2e80: 6d 65 6e 73 69 6f 6e 20 6c 65 73 73 2e 0a 0a 28  mension less...(
2e90: 64 65 66 69 6e 65 20 28 73 68 61 72 65 2d 63 6f  define (share-co
2ea0: 6c 75 6d 6e 20 61 72 72 20 6b 29 0a 20 20 28 73  lumn arr k).  (s
2eb0: 68 61 72 65 2d 61 72 72 61 79 0a 20 20 20 61 72  hare-array.   ar
2ec0: 72 0a 20 20 20 28 6c 65 74 20 28 28 62 6f 75 6e  r.   (let ((boun
2ed0: 64 73 20 28 61 72 72 61 79 2d 3e 6c 69 73 74 20  ds (array->list 
2ee0: 28 61 72 72 61 79 2d 73 68 61 70 65 20 61 72 72  (array-shape arr
2ef0: 29 29 29 29 0a 20 20 20 20 20 28 61 70 70 6c 79  )))).     (apply
2f00: 20 73 68 61 70 65 0a 20 20 20 20 20 20 20 20 20   shape.         
2f10: 20 20 20 28 63 61 72 20 62 6f 75 6e 64 73 29 20     (car bounds) 
2f20: 28 63 61 64 72 20 62 6f 75 6e 64 73 29 0a 20 20  (cadr bounds).  
2f30: 20 20 20 20 20 20 20 20 20 20 28 63 64 64 64 64            (cdddd
2f40: 72 20 62 6f 75 6e 64 73 29 29 29 0a 20 20 20 28  r bounds))).   (
2f50: 6c 61 6d 62 64 61 20 6b 73 0a 20 20 20 20 20 28  lambda ks.     (
2f60: 61 70 70 6c 79 20 76 61 6c 75 65 73 20 28 63 61  apply values (ca
2f70: 72 20 6b 73 29 20 6b 20 28 63 64 72 20 6b 73 29  r ks) k (cdr ks)
2f80: 29 29 29 29 0a 0a 3b 3b 3b 20 28 73 68 61 72 65  ))))..;;; (share
2f90: 2d 61 72 72 61 79 2f 6f 72 69 67 69 6e 20 61 72  -array/origin ar
2fa0: 72 20 6b 20 2e 2e 2e 29 0a 3b 3b 3b 20 28 73 68  r k ...).;;; (sh
2fb0: 61 72 65 2d 61 72 72 61 79 2f 6f 72 69 67 69 6e  are-array/origin
2fc0: 20 61 72 72 20 69 6e 64 65 78 29 0a 3b 3b 3b 20   arr index).;;; 
2fd0: 63 68 61 6e 67 65 20 6f 72 69 67 69 6e 20 74 6f  change origin to
2fe0: 20 6b 20 2e 2e 2e 2c 20 77 69 74 68 20 69 6e 64   k ..., with ind
2ff0: 65 78 20 61 20 76 65 63 74 6f 72 20 6f 72 20 7a  ex a vector or z
3000: 65 72 6f 2d 62 61 73 65 64 0a 3b 3b 3b 20 6f 6e  ero-based.;;; on
3010: 65 2d 64 69 6d 65 6e 73 69 6f 6e 61 6c 20 61 72  e-dimensional ar
3020: 72 61 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ray that contain
3030: 73 20 6b 20 2e 2e 2e 0a 3b 3b 3b 0a 3b 3b 3b 20  s k ....;;;.;;; 
3040: 54 68 69 73 20 69 73 20 75 73 65 66 75 6c 20 66  This is useful f
3050: 6f 72 20 77 72 69 74 69 6e 67 20 61 72 72 61 79  or writing array
3060: 2d 61 70 70 65 6e 64 2e 20 4d 61 79 62 65 20 66  -append. Maybe f
3070: 6f 72 20 73 6f 6d 65 74 68 69 6e 67 0a 3b 3b 3b  or something.;;;
3080: 20 65 6c 73 65 20 74 6f 6f 20 2d 20 77 68 6f 20   else too - who 
3090: 6b 6e 6f 77 73 2e 0a 0a 28 64 65 66 69 6e 65 20  knows...(define 
30a0: 28 73 68 61 72 65 2d 61 72 72 61 79 2f 6f 72 69  (share-array/ori
30b0: 67 69 6e 20 61 72 72 20 2e 20 78 73 29 0a 20 20  gin arr . xs).  
30c0: 28 6c 65 74 20 28 28 6e 65 77 20 28 69 66 20 28  (let ((new (if (
30d0: 6f 72 20 28 6e 75 6c 6c 3f 20 78 73 29 0a 20 20  or (null? xs).  
30e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30f0: 20 20 20 28 69 6e 74 65 67 65 72 3f 20 28 63 61     (integer? (ca
3100: 72 20 78 73 29 29 29 0a 20 20 20 20 20 20 20 20  r xs))).        
3110: 20 20 20 20 20 20 20 20 20 78 73 0a 20 20 20 20           xs.    
3120: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 61 70               (ap
3130: 70 6c 79 20 28 6c 61 6d 62 64 61 20 28 78 29 0a  ply (lambda (x).
3140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3150: 20 20 20 20 20 20 20 20 20 20 28 69 66 20 28 76            (if (v
3160: 65 63 74 6f 72 3f 20 78 29 0a 20 20 20 20 20 20  ector? x).      
3170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3180: 20 20 20 20 20 20 20 20 28 76 65 63 74 6f 72 2d          (vector-
3190: 3e 6c 69 73 74 20 78 29 0a 20 20 20 20 20 20 20  >list x).       
31a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b0: 20 20 20 20 20 20 20 28 69 66 20 28 61 72 72 61         (if (arra
31c0: 79 3f 20 78 29 0a 20 20 20 20 20 20 20 20 20 20  y? x).          
31d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31e0: 20 20 20 20 20 20 20 20 28 61 72 72 61 79 2d 3e          (array->
31f0: 6c 69 73 74 20 78 29 0a 20 20 20 20 20 20 20 20  list x).        
3200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3210: 20 20 20 20 20 20 20 20 20 20 28 65 72 72 6f 72            (error
3220: 20 22 73 68 61 72 65 2d 61 72 72 61 79 2f 6f 72   "share-array/or
3230: 69 67 69 6e 3a 20 62 61 64 20 74 68 69 6e 67 22  igin: bad thing"
3240: 29 29 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  )))).           
3250: 20 20 20 20 20 20 20 20 20 20 20 20 20 78 73 29               xs)
3260: 29 29 29 0a 20 20 20 20 28 64 6f 20 28 28 6b 20  ))).    (do ((k 
3270: 28 61 72 72 61 79 2d 72 61 6e 6b 20 61 72 72 29  (array-rank arr)
3280: 20 28 2d 20 6b 20 31 29 29 0a 20 20 20 20 20 20   (- k 1)).      
3290: 20 20 20 28 6f 6c 64 20 27 28 29 20 28 63 6f 6e     (old '() (con
32a0: 73 20 28 61 72 72 61 79 2d 73 74 61 72 74 20 61  s (array-start a
32b0: 72 72 20 28 2d 20 6b 20 31 29 29 20 6f 6c 64 29  rr (- k 1)) old)
32c0: 29 29 0a 20 20 20 20 20 20 28 28 3d 20 6b 20 30  )).      ((= k 0
32d0: 29 0a 20 20 20 20 20 20 20 28 6c 65 74 20 28 28  ).       (let ((
32e0: 64 73 20 28 6d 61 70 20 2d 20 6e 65 77 20 6f 6c  ds (map - new ol
32f0: 64 29 29 29 0a 20 20 20 20 20 20 20 20 20 28 73  d))).         (s
3300: 68 61 72 65 2d 61 72 72 61 79 0a 20 20 20 20 20  hare-array.     
3310: 20 20 20 20 20 61 72 72 0a 20 20 20 20 20 20 20       arr.       
3320: 20 20 20 28 74 61 62 75 6c 61 74 65 2d 61 72 72     (tabulate-arr
3330: 61 79 0a 20 20 20 20 20 20 20 20 20 20 20 28 73  ay.           (s
3340: 68 61 70 65 20 30 20 28 61 72 72 61 79 2d 72 61  hape 0 (array-ra
3350: 6e 6b 20 61 72 72 29 20 30 20 32 29 0a 20 20 20  nk arr) 0 2).   
3360: 20 20 20 20 20 20 20 20 28 6c 61 6d 62 64 61 20          (lambda 
3370: 28 72 20 6b 29 0a 20 20 20 20 20 20 20 20 20 20  (r k).          
3380: 20 20 20 28 63 61 73 65 20 6b 0a 20 20 20 20 20     (case k.     
3390: 20 20 20 20 20 20 20 20 20 20 28 28 30 29 20 28            ((0) (
33a0: 2b 20 28 61 72 72 61 79 2d 73 74 61 72 74 20 61  + (array-start a
33b0: 72 72 20 72 29 20 28 6c 69 73 74 2d 72 65 66 20  rr r) (list-ref 
33c0: 64 73 20 72 29 29 29 0a 20 20 20 20 20 20 20 20  ds r))).        
33d0: 20 20 20 20 20 20 20 28 28 31 29 20 28 2b 20 28         ((1) (+ (
33e0: 61 72 72 61 79 2d 65 6e 64 20 61 72 72 20 72 29  array-end arr r)
33f0: 20 28 6c 69 73 74 2d 72 65 66 20 64 73 20 72 29   (list-ref ds r)
3400: 29 29 29 29 29 0a 20 20 20 20 20 20 20 20 20 20  ))))).          
3410: 28 6c 61 6d 62 64 61 20 6b 73 0a 20 20 20 20 20  (lambda ks.     
3420: 20 20 20 20 20 20 20 28 61 70 70 6c 79 20 76 61         (apply va
3430: 6c 75 65 73 20 28 6d 61 70 20 2d 20 6b 73 20 64  lues (map - ks d
3440: 73 29 29 29 29 29 29 29 29 29 0a 0a 3b 3b 3b 20  s)))))))))..;;; 
3450: 53 52 46 49 2d 32 35 20 6d 61 69 6c 69 6e 67 20  SRFI-25 mailing 
3460: 6c 69 73 74 20 72 65 71 75 65 73 74 65 64 20 6d  list requested m
3470: 61 6b 69 6e 67 20 73 68 61 70 65 73 20 74 68 65  aking shapes the
3480: 69 72 20 6f 77 6e 20 74 79 70 65 2e 20 48 65 72  ir own type. Her
3490: 65 27 73 0a 3b 3b 3b 20 61 6e 20 65 78 61 6d 70  e's.;;; an examp
34a0: 6c 65 20 6f 66 20 68 6f 77 20 6d 61 6e 69 70 75  le of how manipu
34b0: 6c 61 74 69 6e 67 20 73 68 61 70 65 73 20 61 73  lating shapes as
34c0: 20 61 72 72 61 79 73 20 63 61 6e 20 62 65 20 75   arrays can be u
34d0: 73 65 66 75 6c 2e 20 54 68 65 0a 3b 3b 3b 20 65  seful. The.;;; e
34e0: 78 61 6d 70 6c 65 20 61 6c 73 6f 20 74 65 73 74  xample also test
34f0: 73 20 74 68 61 74 20 68 69 67 68 65 72 20 6c 65  s that higher le
3500: 76 65 6c 20 6c 69 62 72 61 72 69 65 73 20 61 72  vel libraries ar
3510: 65 20 69 6e 64 65 65 64 20 65 61 73 79 20 74 6f  e indeed easy to
3520: 0a 3b 3b 3b 20 77 72 69 74 65 20 6f 6e 20 74 6f  .;;; write on to
3530: 70 20 6f 66 20 74 68 69 73 20 53 52 46 49 2e 0a  p of this SRFI..
3540: 0a 3b 3b 3b 20 28 61 72 72 61 79 2d 61 70 70 65  .;;; (array-appe
3550: 6e 64 20 61 72 72 31 20 61 72 72 32 20 64 69 6d  nd arr1 arr2 dim
3560: 29 0a 3b 3b 3b 20 61 70 70 65 6e 64 73 20 74 77  ).;;; appends tw
3570: 6f 20 61 72 72 61 79 73 20 61 6c 6f 6e 67 20 61  o arrays along a
3580: 20 73 70 65 63 69 66 69 65 64 20 64 69 6d 65 6e   specified dimen
3590: 73 69 6f 6e 2e 20 54 68 65 20 61 72 72 61 79 73  sion. The arrays
35a0: 20 6d 75 73 74 0a 3b 3b 3b 20 68 61 76 65 20 65   must.;;; have e
35b0: 71 75 61 6c 6c 79 20 6d 61 6e 79 20 64 69 6d 65  qually many dime
35c0: 6e 73 69 6f 6e 73 20 61 6e 64 20 61 6c 6c 20 6f  nsions and all o
35d0: 74 68 65 72 20 64 69 6d 65 6e 73 69 6f 6e 73 20  ther dimensions 
35e0: 65 71 75 61 6c 6c 79 20 6c 6f 6e 67 2e 0a 3b 3b  equally long..;;
35f0: 3b 0a 3b 3b 3b 20 47 65 6e 65 72 61 6c 69 7a 65  ;.;;; Generalize
3600: 20 74 6f 20 6d 6f 72 65 20 61 72 72 61 79 73 20   to more arrays 
3610: 61 6e 64 20 6d 61 79 62 65 20 72 65 77 72 69 74  and maybe rewrit
3620: 65 20 77 69 74 68 20 73 68 61 70 65 2d 66 6f 72  e with shape-for
3630: 2d 65 61 63 68 20 6f 72 0a 3b 3b 3b 20 77 68 61  -each or.;;; wha
3640: 74 20 68 61 76 65 20 79 6f 75 2e 0a 0a 28 64 65  t have you...(de
3650: 66 69 6e 65 20 28 61 72 72 61 79 2d 61 70 70 65  fine (array-appe
3660: 6e 64 20 64 69 6d 20 61 72 72 20 2e 20 61 72 73  nd dim arr . ars
3670: 29 0a 20 20 28 6c 65 74 2a 20 28 28 74 6f 74 61  ).  (let* ((tota
3680: 6c 20 28 64 6f 20 28 28 6d 20 28 61 72 72 61 79  l (do ((m (array
3690: 2d 6c 65 6e 67 74 68 20 61 72 72 20 64 69 6d 29  -length arr dim)
36a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
36b0: 20 20 20 20 20 20 20 20 20 28 2b 20 6d 20 28 61           (+ m (a
36c0: 72 72 61 79 2d 6c 65 6e 67 74 68 20 28 63 61 72  rray-length (car
36d0: 20 72 29 20 64 69 6d 29 29 29 0a 20 20 20 20 20   r) dim))).     
36e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36f0: 28 72 20 61 72 73 20 28 63 64 72 20 72 29 29 29  (r ars (cdr r)))
3700: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3710: 20 20 20 28 28 6e 75 6c 6c 3f 20 72 29 20 6d 29     ((null? r) m)
3720: 29 29 0a 20 20 20 20 20 20 20 20 20 28 63 6f 6d  )).         (com
3730: 6d 6f 6e 20 28 61 72 72 61 79 2d 73 68 61 70 65  mon (array-shape
3740: 20 61 72 72 29 29 0a 20 20 20 20 20 20 20 20 20   arr)).         
3750: 28 6f 72 69 67 69 6e 20 28 61 72 72 61 79 2d 3e  (origin (array->
3760: 76 65 63 74 6f 72 20 28 73 68 61 72 65 2d 63 6f  vector (share-co
3770: 6c 75 6d 6e 20 63 6f 6d 6d 6f 6e 20 30 29 29 29  lumn common 0)))
3780: 0a 20 20 20 20 20 20 20 20 20 28 69 6e 64 65 78  .         (index
3790: 20 28 6d 61 6b 65 2d 76 65 63 74 6f 72 20 28 61   (make-vector (a
37a0: 72 72 61 79 2d 72 61 6e 6b 20 61 72 72 29 29 29  rray-rank arr)))
37b0: 29 0a 20 20 20 20 28 61 72 72 61 79 2d 73 65 74  ).    (array-set
37c0: 21 20 63 6f 6d 6d 6f 6e 20 64 69 6d 20 31 20 28  ! common dim 1 (
37d0: 2b 20 28 61 72 72 61 79 2d 73 74 61 72 74 20 61  + (array-start a
37e0: 72 72 20 64 69 6d 29 20 74 6f 74 61 6c 29 29 0a  rr dim) total)).
37f0: 20 20 20 20 28 6c 65 74 20 28 28 72 65 73 75 6c      (let ((resul
3800: 74 20 28 6d 61 6b 65 2d 61 72 72 61 79 20 63 6f  t (make-array co
3810: 6d 6d 6f 6e 29 29 29 0a 20 20 20 20 20 20 28 61  mmon))).      (a
3820: 72 72 61 79 2d 73 65 74 21 20 63 6f 6d 6d 6f 6e  rray-set! common
3830: 20 64 69 6d 20 31 20 28 61 72 72 61 79 2d 73 74   dim 1 (array-st
3840: 61 72 74 20 61 72 72 20 64 69 6d 29 29 0a 20 20  art arr dim)).  
3850: 20 20 20 20 28 6c 65 74 20 77 6f 6b 20 28 28 61      (let wok ((a
3860: 72 72 20 61 72 72 29 0a 20 20 20 20 20 20 20 20  rr arr).        
3870: 20 20 20 20 20 20 20 20 28 61 72 73 20 61 72 73          (ars ars
3880: 29 29 0a 20 20 20 20 20 20 20 20 28 76 65 63 74  )).        (vect
3890: 6f 72 2d 73 65 74 21 20 6f 72 69 67 69 6e 20 64  or-set! origin d
38a0: 69 6d 20 28 61 72 72 61 79 2d 72 65 66 20 63 6f  im (array-ref co
38b0: 6d 6d 6f 6e 20 64 69 6d 20 31 29 29 0a 20 20 20  mmon dim 1)).   
38c0: 20 20 20 20 20 28 6c 65 74 20 28 28 61 72 72 31       (let ((arr1
38d0: 20 28 73 68 61 72 65 2d 61 72 72 61 79 2f 6f 72   (share-array/or
38e0: 69 67 69 6e 20 61 72 72 20 6f 72 69 67 69 6e 29  igin arr origin)
38f0: 29 29 0a 20 20 20 20 20 20 20 20 20 20 28 61 72  )).          (ar
3900: 72 61 79 2d 73 65 74 21 20 63 6f 6d 6d 6f 6e 20  ray-set! common 
3910: 64 69 6d 20 30 20 28 61 72 72 61 79 2d 73 74 61  dim 0 (array-sta
3920: 72 74 20 61 72 72 31 20 64 69 6d 29 29 0a 20 20  rt arr1 dim)).  
3930: 20 20 20 20 20 20 20 20 28 61 72 72 61 79 2d 73          (array-s
3940: 65 74 21 20 63 6f 6d 6d 6f 6e 20 64 69 6d 20 31  et! common dim 1
3950: 20 28 61 72 72 61 79 2d 65 6e 64 20 61 72 72 31   (array-end arr1
3960: 20 64 69 6d 29 29 0a 20 20 20 20 20 20 20 20 20   dim)).         
3970: 20 28 73 68 61 70 65 2d 66 6f 72 2d 65 61 63 68   (shape-for-each
3980: 0a 20 20 20 20 20 20 20 20 20 20 20 63 6f 6d 6d  .           comm
3990: 6f 6e 0a 20 20 20 20 20 20 20 20 20 20 20 28 6c  on.           (l
39a0: 61 6d 62 64 61 20 28 69 6e 64 65 78 29 0a 20 20  ambda (index).  
39b0: 20 20 20 20 20 20 20 20 20 20 20 28 61 72 72 61             (arra
39c0: 79 2d 73 65 74 21 20 72 65 73 75 6c 74 20 69 6e  y-set! result in
39d0: 64 65 78 20 28 61 72 72 61 79 2d 72 65 66 20 61  dex (array-ref a
39e0: 72 72 31 20 69 6e 64 65 78 29 29 29 0a 20 20 20  rr1 index))).   
39f0: 20 20 20 20 20 20 20 20 69 6e 64 65 78 29 29 0a          index)).
3a00: 20 20 20 20 20 20 20 20 28 69 66 20 28 70 61 69          (if (pai
3a10: 72 3f 20 61 72 73 29 0a 20 20 20 20 20 20 20 20  r? ars).        
3a20: 20 20 20 20 28 77 6f 6b 20 28 63 61 72 20 61 72      (wok (car ar
3a30: 73 29 20 28 63 64 72 20 61 72 73 29 29 29 29 0a  s) (cdr ars)))).
3a40: 20 20 20 20 20 20 72 65 73 75 6c 74 29 29 29 0a        result))).
3a50: 0a 3b 3b 3b 20 54 72 61 6e 73 70 6f 73 65 2c 20  .;;; Transpose, 
3a60: 61 73 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 6f  as permutation o
3a70: 66 20 64 69 6d 65 6e 73 69 6f 6e 73 2c 20 69 73  f dimensions, is
3a80: 20 61 70 70 6c 69 63 61 62 6c 65 20 74 6f 20 61   applicable to a
3a90: 6c 6c 0a 3b 3b 3b 20 61 72 72 61 79 73 2e 20 54  ll.;;; arrays. T
3aa0: 68 65 20 64 65 66 61 75 6c 74 20 69 73 20 72 65  he default is re
3ab0: 76 65 72 73 61 6c 2e 0a 0a 3b 3b 3b 20 54 68 65  versal...;;; The
3ac0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
3ad0: 75 73 65 73 20 6d 75 6c 74 69 70 6c 69 63 61 74  uses multiplicat
3ae0: 69 6f 6e 20 62 79 20 70 65 72 6d 75 74 61 74 69  ion by permutati
3af0: 6f 6e 0a 3b 3b 3b 20 6d 61 74 72 69 78 20 62 75  on.;;; matrix bu
3b00: 74 20 6d 61 74 72 69 78 20 6d 75 6c 74 69 70 6c  t matrix multipl
3b10: 69 63 61 74 69 6f 6e 20 69 73 20 6e 6f 74 20 65  ication is not e
3b20: 78 70 6f 72 74 65 64 2e 0a 0a 28 64 65 66 69 6e  xported...(defin
3b30: 65 20 28 61 72 72 61 79 3a 61 72 6c 69 62 3a 6d  e (array:arlib:m
3b40: 61 74 72 69 78 2d 74 69 6d 65 73 20 61 20 62 29  atrix-times a b)
3b50: 0a 20 20 28 6f 72 20 28 61 6e 64 20 28 3d 20 28  .  (or (and (= (
3b60: 61 72 72 61 79 2d 72 61 6e 6b 20 61 29 20 32 29  array-rank a) 2)
3b70: 0a 20 20 20 20 20 20 20 20 20 20 20 28 3d 20 28  .           (= (
3b80: 61 72 72 61 79 2d 72 61 6e 6b 20 62 29 20 32 29  array-rank b) 2)
3b90: 29 0a 20 20 20 20 20 20 28 65 72 72 6f 72 20 22  ).      (error "
3ba0: 74 69 6d 65 73 3a 20 61 72 72 61 79 73 20 61 72  times: arrays ar
3bb0: 65 20 6e 6f 74 20 6d 61 74 72 69 63 65 73 22 29  e not matrices")
3bc0: 29 0a 20 20 28 6c 65 74 20 28 28 72 30 20 28 61  ).  (let ((r0 (a
3bd0: 72 72 61 79 2d 73 74 61 72 74 20 61 20 30 29 29  rray-start a 0))
3be0: 20 20 28 72 6e 20 28 61 72 72 61 79 2d 65 6e 64    (rn (array-end
3bf0: 20 61 20 30 29 29 0a 20 20 20 20 20 20 20 20 28   a 0)).        (
3c00: 74 30 20 28 61 72 72 61 79 2d 73 74 61 72 74 20  t0 (array-start 
3c10: 61 20 31 29 29 20 20 28 74 6e 20 28 61 72 72 61  a 1))  (tn (arra
3c20: 79 2d 65 6e 64 20 61 20 31 29 29 0a 20 20 20 20  y-end a 1)).    
3c30: 20 20 20 20 28 75 30 20 28 61 72 72 61 79 2d 73      (u0 (array-s
3c40: 74 61 72 74 20 62 20 30 29 29 20 20 28 75 6e 20  tart b 0))  (un 
3c50: 28 61 72 72 61 79 2d 65 6e 64 20 62 20 30 29 29  (array-end b 0))
3c60: 20 0a 20 20 20 20 20 20 20 20 28 6b 30 20 28 61   .        (k0 (a
3c70: 72 72 61 79 2d 73 74 61 72 74 20 62 20 31 29 29  rray-start b 1))
3c80: 20 20 28 6b 6e 20 28 61 72 72 61 79 2d 65 6e 64    (kn (array-end
3c90: 20 62 20 31 29 29 29 0a 20 20 20 20 28 6f 72 20   b 1))).    (or 
3ca0: 28 3d 20 28 2d 20 74 6e 20 74 30 29 20 28 2d 20  (= (- tn t0) (- 
3cb0: 75 6e 20 75 30 29 29 0a 20 20 20 20 20 20 20 20  un u0)).        
3cc0: 28 65 72 72 6f 72 20 22 74 69 6d 65 73 3a 20 6d  (error "times: m
3cd0: 61 74 72 69 63 65 73 20 61 72 65 20 6e 6f 74 20  atrices are not 
3ce0: 63 6f 6d 70 61 74 69 62 6c 65 22 29 29 0a 20 20  compatible")).  
3cf0: 20 20 28 6c 65 74 20 28 28 61 62 20 28 6d 61 6b    (let ((ab (mak
3d00: 65 2d 61 72 72 61 79 20 28 73 68 61 70 65 20 72  e-array (shape r
3d10: 30 20 72 6e 20 6b 30 20 6b 6e 29 29 29 29 0a 20  0 rn k0 kn)))). 
3d20: 20 20 20 20 20 28 64 6f 20 28 28 72 20 72 30 20       (do ((r r0 
3d30: 28 2b 20 72 20 31 29 29 29 0a 20 20 20 20 20 20  (+ r 1))).      
3d40: 20 20 28 28 3d 20 72 20 72 6e 29 29 0a 20 20 20    ((= r rn)).   
3d50: 20 20 20 20 20 28 64 6f 20 28 28 6b 20 6b 30 20       (do ((k k0 
3d60: 28 2b 20 6b 20 31 29 29 29 0a 20 20 20 20 20 20  (+ k 1))).      
3d70: 20 20 20 20 28 28 3d 20 6b 20 6b 6e 29 29 0a 20      ((= k kn)). 
3d80: 20 20 20 20 20 20 20 20 20 28 64 6f 20 28 28 74           (do ((t
3d90: 20 74 30 20 28 2b 20 74 20 31 29 29 0a 20 20 20   t0 (+ t 1)).   
3da0: 20 20 20 20 20 20 20 20 20 20 20 20 28 75 20 75              (u u
3db0: 30 20 28 2b 20 75 20 31 29 29 0a 20 20 20 20 20  0 (+ u 1)).     
3dc0: 20 20 20 20 20 20 20 20 20 20 28 73 20 30 20 28            (s 0 (
3dd0: 2b 20 73 20 28 2a 20 28 61 72 72 61 79 2d 72 65  + s (* (array-re
3de0: 66 20 61 20 72 20 74 29 0a 20 20 20 20 20 20 20  f a r t).       
3df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e00: 20 20 20 20 20 28 61 72 72 61 79 2d 72 65 66 20       (array-ref 
3e10: 62 20 75 20 6b 29 29 29 29 29 0a 20 20 20 20 20  b u k))))).     
3e20: 20 20 20 20 20 20 20 28 28 61 6e 64 20 28 3d 20         ((and (= 
3e30: 74 20 74 6e 29 0a 20 20 20 20 20 20 20 20 20 20  t tn).          
3e40: 20 20 20 20 20 20 20 20 28 3d 20 75 20 75 6e 29          (= u un)
3e50: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ).             (
3e60: 61 72 72 61 79 2d 73 65 74 21 20 61 62 20 72 20  array-set! ab r 
3e70: 6b 20 73 29 29 29 29 29 0a 20 20 20 20 20 20 61  k s))))).      a
3e80: 62 29 29 29 0a 0a 3b 20 54 68 69 73 20 69 73 20  b)))..; This is 
3e90: 61 20 67 65 6e 65 72 61 6c 69 7a 65 64 20 74 72  a generalized tr
3ea0: 61 6e 73 70 6f 73 65 2e 20 49 74 20 63 61 6e 20  anspose. It can 
3eb0: 70 65 72 6d 75 74 65 20 74 68 65 20 64 69 6d 65  permute the dime
3ec0: 6e 73 69 6f 6e 73 20 61 6e 79 20 77 68 69 63 68  nsions any which
3ed0: 20 0a 3b 20 77 61 79 2e 20 54 68 65 20 70 65 72   .; way. The per
3ee0: 6d 75 74 61 74 69 6f 6e 20 69 73 20 70 72 6f 76  mutation is prov
3ef0: 69 64 65 64 20 62 79 20 61 20 70 65 72 6d 75 74  ided by a permut
3f00: 61 74 69 6f 6e 20 6d 61 74 72 69 78 3a 20 61 20  ation matrix: a 
3f10: 73 71 75 61 72 65 20 6d 61 74 72 69 78 0a 3b 20  square matrix.; 
3f20: 6f 66 20 7a 65 72 6f 73 20 61 6e 64 20 6f 6e 65  of zeros and one
3f30: 73 2c 20 77 69 74 68 20 65 78 61 63 74 6c 79 20  s, with exactly 
3f40: 6f 6e 65 20 6f 6e 65 20 69 6e 20 65 61 63 68 20  one one in each 
3f50: 72 6f 77 20 61 6e 64 20 63 6f 6c 75 6d 6e 2c 20  row and column, 
3f60: 6f 72 20 61 0a 3b 20 70 65 72 6d 75 74 61 74 69  or a.; permutati
3f70: 6f 6e 20 6f 66 20 74 68 65 20 72 6f 77 73 20 6f  on of the rows o
3f80: 66 20 61 6e 20 69 64 65 6e 74 69 74 79 20 6d 61  f an identity ma
3f90: 74 72 69 78 3b 20 74 68 65 20 73 69 7a 65 20 6f  trix; the size o
3fa0: 66 20 74 68 65 20 6d 61 74 72 69 78 0a 3b 20 6d  f the matrix.; m
3fb0: 75 73 74 20 6d 61 74 63 68 20 74 68 65 20 6e 75  ust match the nu
3fc0: 6d 62 65 72 20 6f 66 20 64 69 6d 65 6e 73 69 6f  mber of dimensio
3fd0: 6e 73 20 6f 66 20 74 68 65 20 61 72 72 61 79 2e  ns of the array.
3fe0: 0a 3b 0a 3b 20 54 68 65 20 64 65 66 61 75 6c 74  .;.; The default
3ff0: 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 69 73 20   permutation is 
4000: 5b 20 30 20 31 20 7c 20 31 20 30 20 5d 20 6f 66  [ 0 1 | 1 0 ] of
4010: 20 63 6f 75 72 73 65 2c 20 62 75 74 20 61 6e 79   course, but any
4020: 20 70 65 72 6d 75 74 61 74 69 6f 6e 0a 3b 20 61   permutation.; a
4030: 72 72 61 79 20 63 61 6e 20 62 65 20 73 70 65 63  rray can be spec
4040: 69 66 69 65 64 2c 20 61 6e 64 20 74 68 65 20 73  ified, and the s
4050: 68 61 70 65 20 61 72 72 61 79 20 6f 66 20 74 68  hape array of th
4060: 65 20 6f 72 69 67 69 6e 61 6c 20 61 72 72 61 79  e original array
4070: 20 69 73 20 74 68 65 6e 0a 3b 20 6d 75 6c 74 69   is then.; multi
4080: 70 6c 69 65 64 20 77 69 74 68 20 69 74 2c 20 61  plied with it, a
4090: 6e 64 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20  nd index column 
40a0: 76 65 63 74 6f 72 73 20 6f 66 20 74 68 65 20 6e  vectors of the n
40b0: 65 77 20 61 72 72 61 79 20 77 69 74 68 20 69 74  ew array with it
40c0: 73 0a 3b 20 69 6e 76 65 72 73 65 2c 20 66 72 6f  s.; inverse, fro
40d0: 6d 20 6c 65 66 74 2c 20 74 6f 20 70 65 72 6d 75  m left, to permu
40e0: 74 65 20 74 68 65 20 72 6f 77 73 20 61 70 70 72  te the rows appr
40f0: 6f 70 72 69 61 74 65 6c 79 2e 0a 0a 28 64 65 66  opriately...(def
4100: 69 6e 65 20 28 61 72 72 61 79 3a 61 72 6c 69 62  ine (array:arlib
4110: 3a 70 65 72 6d 75 74 61 74 69 6f 6e 2d 6d 61 74  :permutation-mat
4120: 72 69 78 20 2e 20 64 73 29 0a 20 20 28 6c 65 74  rix . ds).  (let
4130: 2a 20 28 28 6e 20 28 6c 65 6e 67 74 68 20 64 73  * ((n (length ds
4140: 29 29 0a 20 20 20 20 20 20 20 20 20 28 61 72 72  )).         (arr
4150: 20 28 6d 61 6b 65 2d 61 72 72 61 79 20 28 73 68   (make-array (sh
4160: 61 70 65 20 30 20 6e 20 30 20 6e 29 20 30 29 29  ape 0 n 0 n) 0))
4170: 29 0a 20 20 20 20 28 64 6f 20 28 28 6b 20 30 20  ).    (do ((k 0 
4180: 28 2b 20 6b 20 31 29 29 0a 20 20 20 20 20 20 20  (+ k 1)).       
4190: 20 20 28 64 73 20 64 73 20 28 63 64 72 20 64 73    (ds ds (cdr ds
41a0: 29 29 29 0a 20 20 20 20 20 20 28 28 3d 20 6b 20  ))).      ((= k 
41b0: 6e 29 29 0a 20 20 20 20 20 20 28 61 72 72 61 79  n)).      (array
41c0: 2d 73 65 74 21 20 61 72 72 20 6b 20 28 63 61 72  -set! arr k (car
41d0: 20 64 73 29 20 31 29 29 0a 20 20 20 20 61 72 72   ds) 1)).    arr
41e0: 29 29 0a 0a 3b 3b 3b 20 28 74 72 61 6e 73 70 6f  ))..;;; (transpo
41f0: 73 65 20 61 72 72 20 6b 20 2e 2e 2e 29 0a 3b 3b  se arr k ...).;;
4200: 3b 20 73 68 61 72 65 73 20 61 72 72 20 77 69 74  ; shares arr wit
4210: 68 20 70 65 72 6d 75 74 65 64 20 64 69 6d 65 6e  h permuted dimen
4220: 73 69 6f 6e 73 2e 20 45 61 63 68 20 64 69 6d 65  sions. Each dime
4230: 6e 73 69 6f 6e 20 66 72 6f 6d 20 30 0a 3b 3b 3b  nsion from 0.;;;
4240: 20 69 6e 63 6c 75 73 69 76 65 20 74 6f 20 72 61   inclusive to ra
4250: 6e 6b 20 65 78 63 6c 75 73 69 76 65 20 6d 75 73  nk exclusive mus
4260: 74 20 61 70 70 65 61 72 20 6f 6e 63 65 20 69 6e  t appear once in
4270: 20 6b 20 2e 2e 2e 0a 0a 28 64 65 66 69 6e 65 20   k .....(define 
4280: 28 74 72 61 6e 73 70 6f 73 65 20 61 20 2e 20 70  (transpose a . p
4290: 30 29 0a 20 20 28 6c 65 74 2a 20 28 28 72 20 28  0).  (let* ((r (
42a0: 61 72 72 61 79 2d 72 61 6e 6b 20 61 29 29 0a 20  array-rank a)). 
42b0: 20 20 20 20 20 20 20 20 28 70 65 72 6d 75 74 61          (permuta
42c0: 74 69 6f 6e 20 28 61 70 70 6c 79 20 61 72 72 61  tion (apply arra
42d0: 79 3a 61 72 6c 69 62 3a 70 65 72 6d 75 74 61 74  y:arlib:permutat
42e0: 69 6f 6e 2d 6d 61 74 72 69 78 0a 20 20 20 20 20  ion-matrix.     
42f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4300: 20 20 20 20 20 20 20 20 28 69 66 20 28 70 61 69          (if (pai
4310: 72 3f 20 70 30 29 0a 20 20 20 20 20 20 20 20 20  r? p0).         
4320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4330: 20 20 20 20 20 20 20 20 70 30 0a 20 20 20 20 20          p0.     
4340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4350: 20 20 20 20 20 20 20 20 20 20 20 20 28 64 6f 20              (do 
4360: 28 28 64 73 20 27 28 29 20 28 63 6f 6e 73 20 64  ((ds '() (cons d
4370: 20 64 73 29 29 0a 20 20 20 20 20 20 20 20 20 20   ds)).          
4380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4390: 20 20 20 20 20 20 20 20 20 20 20 20 28 64 20 30              (d 0
43a0: 20 28 2b 20 64 20 31 29 29 29 0a 20 20 20 20 20   (+ d 1))).     
43b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28                ((
43d0: 3d 20 64 20 72 29 0a 20 20 20 20 20 20 20 20 20  = d r).         
43e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43f0: 20 20 20 20 20 20 20 20 20 20 20 3b 3b 20 72 65             ;; re
4400: 76 65 72 73 65 20 64 69 6d 65 6e 73 69 6f 6e 73  verse dimensions
4410: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4430: 20 20 20 20 20 64 73 29 29 29 29 29 0a 20 20 20       ds))))).   
4440: 20 20 20 20 20 20 28 69 6e 76 65 72 73 65 2d 70        (inverse-p
4450: 65 72 6d 75 74 61 74 69 6f 6e 20 28 73 68 61 72  ermutation (shar
4460: 65 2d 61 72 72 61 79 20 70 65 72 6d 75 74 61 74  e-array permutat
4470: 69 6f 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ion.            
4480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
44a0: 61 72 72 61 79 2d 73 68 61 70 65 20 70 65 72 6d  array-shape perm
44b0: 75 74 61 74 69 6f 6e 29 0a 20 20 20 20 20 20 20  utation).       
44c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44e0: 20 20 20 20 28 6c 61 6d 62 64 61 20 28 72 20 6b      (lambda (r k
44f0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
4500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3b                 ;
4520: 3b 20 74 72 61 6e 73 70 6f 73 65 0a 20 20 20 20  ; transpose.    
4530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4550: 20 20 20 20 20 20 20 20 20 28 76 61 6c 75 65 73           (values
4560: 20 6b 20 72 29 29 29 29 29 0a 20 20 20 20 28 73   k r))))).    (s
4570: 68 61 72 65 2d 61 72 72 61 79 0a 20 20 20 20 20  hare-array.     
4580: 61 0a 20 20 20 20 20 28 61 72 72 61 79 3a 61 72  a.     (array:ar
4590: 6c 69 62 3a 6d 61 74 72 69 78 2d 74 69 6d 65 73  lib:matrix-times
45a0: 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 28 61 72   permutation (ar
45b0: 72 61 79 2d 73 68 61 70 65 20 61 29 29 0a 20 20  ray-shape a)).  
45c0: 20 20 20 28 6c 61 6d 62 64 61 20 6b 73 30 0a 20     (lambda ks0. 
45d0: 20 20 20 20 20 20 28 61 70 70 6c 79 20 76 61 6c        (apply val
45e0: 75 65 73 0a 20 20 20 20 20 20 20 20 20 20 20 20  ues.            
45f0: 20 20 28 61 72 72 61 79 2d 3e 6c 69 73 74 0a 20    (array->list. 
4600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 61                (a
4610: 72 72 61 79 3a 61 72 6c 69 62 3a 6d 61 74 72 69  rray:arlib:matri
4620: 78 2d 74 69 6d 65 73 0a 20 20 20 20 20 20 20 20  x-times.        
4630: 20 20 20 20 20 20 20 20 69 6e 76 65 72 73 65 2d          inverse-
4640: 70 65 72 6d 75 74 61 74 69 6f 6e 0a 20 20 20 20  permutation.    
4650: 20 20 20 20 20 20 20 20 20 20 20 20 28 61 70 70              (app
4660: 6c 79 20 61 72 72 61 79 20 28 73 68 61 70 65 20  ly array (shape 
4670: 30 20 72 20 30 20 31 29 20 6b 73 30 29 29 29 29  0 r 0 1) ks0))))
4680: 29 29 29 29 0a 0a 3b 3b 3b 20 28 73 68 61 72 65  ))))..;;; (share
4690: 2d 61 72 72 61 79 2f 69 6e 64 65 78 21 20 61 72  -array/index! ar
46a0: 72 61 79 20 73 75 62 73 68 61 70 65 20 70 72 6f  ray subshape pro
46b0: 63 20 69 6e 64 65 78 29 0a 0a 28 64 65 66 69 6e  c index)..(defin
46c0: 65 20 28 73 68 61 72 65 2d 61 72 72 61 79 2f 69  e (share-array/i
46d0: 6e 64 65 78 21 20 61 72 72 61 79 20 73 75 62 73  ndex! array subs
46e0: 68 61 70 65 20 70 72 6f 63 20 69 6e 64 65 78 29  hape proc index)
46f0: 0a 20 20 28 61 72 72 61 79 3a 73 68 61 72 65 2f  .  (array:share/
4700: 69 6e 64 65 78 21 20 61 72 72 61 79 20 73 75 62  index! array sub
4710: 73 68 61 70 65 20 70 72 6f 63 20 69 6e 64 65 78  shape proc index
4720: 29 29 0a 0a 3b 3b 3b 20 54 61 6b 65 20 65 76 65  ))..;;; Take eve
4730: 72 79 20 6e 74 68 20 73 6c 69 63 65 20 61 6c 6f  ry nth slice alo
4740: 6e 67 20 64 69 6d 65 6e 73 69 6f 6e 20 64 20 69  ng dimension d i
4750: 6e 74 6f 20 61 20 73 68 61 72 65 64 20 61 72 72  nto a shared arr
4760: 61 79 2e 20 54 68 69 73 0a 3b 3b 3b 20 70 72 65  ay. This.;;; pre
4770: 73 65 72 76 65 73 20 74 68 65 20 6f 72 69 67 69  serves the origi
4780: 6e 2e 0a 0a 28 64 65 66 69 6e 65 20 28 73 68 61  n...(define (sha
4790: 72 65 2d 6e 74 68 73 20 61 72 72 20 64 20 6e 29  re-nths arr d n)
47a0: 0a 20 20 28 6c 65 74 2a 20 28 28 62 6f 75 6e 64  .  (let* ((bound
47b0: 73 20 28 61 72 72 61 79 2d 3e 76 65 63 74 6f 72  s (array->vector
47c0: 20 28 61 72 72 61 79 2d 73 68 61 70 65 20 61 72   (array-shape ar
47d0: 72 29 29 29 0a 20 20 20 20 20 20 20 20 20 28 62  r))).         (b
47e0: 20 28 76 65 63 74 6f 72 2d 72 65 66 20 62 6f 75   (vector-ref bou
47f0: 6e 64 73 20 28 2a 20 32 20 64 29 29 29 0a 20 20  nds (* 2 d))).  
4800: 20 20 20 20 20 20 20 28 65 20 28 76 65 63 74 6f         (e (vecto
4810: 72 2d 72 65 66 20 62 6f 75 6e 64 73 20 28 2b 20  r-ref bounds (+ 
4820: 28 2a 20 32 20 64 29 20 31 29 29 29 29 0a 20 20  (* 2 d) 1)))).  
4830: 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21 20 62    (vector-set! b
4840: 6f 75 6e 64 73 20 28 2b 20 28 2a 20 32 20 64 29  ounds (+ (* 2 d)
4850: 20 31 29 20 28 2b 20 62 20 28 71 75 6f 74 69 65   1) (+ b (quotie
4860: 6e 74 20 28 2b 20 6e 20 28 2d 20 65 20 62 20 31  nt (+ n (- e b 1
4870: 29 29 20 6e 29 29 29 0a 20 20 20 20 28 73 68 61  )) n))).    (sha
4880: 72 65 2d 61 72 72 61 79 0a 20 20 20 20 20 61 72  re-array.     ar
4890: 72 0a 20 20 20 20 20 28 61 70 70 6c 79 20 73 68  r.     (apply sh
48a0: 61 70 65 20 28 76 65 63 74 6f 72 2d 3e 6c 69 73  ape (vector->lis
48b0: 74 20 62 6f 75 6e 64 73 29 29 0a 20 20 20 20 20  t bounds)).     
48c0: 28 6c 61 6d 62 64 61 20 6b 73 0a 20 20 20 20 20  (lambda ks.     
48d0: 20 20 28 61 70 70 6c 79 20 76 61 6c 75 65 73 0a    (apply values.
48e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6c                (l
48f0: 65 74 20 64 2f 6e 6b 20 28 28 75 20 30 29 20 28  et d/nk ((u 0) (
4900: 6b 73 20 6b 73 29 29 0a 20 20 20 20 20 20 20 20  ks ks)).        
4910: 20 20 20 20 20 20 20 20 28 69 66 20 28 3d 20 75          (if (= u
4920: 20 64 29 0a 20 20 20 20 20 20 20 20 20 20 20 20   d).            
4930: 20 20 20 20 20 20 20 20 28 63 6f 6e 73 20 28 2b          (cons (+
4940: 20 62 20 28 2a 20 6e 20 28 2d 20 28 63 61 72 20   b (* n (- (car 
4950: 6b 73 29 20 62 29 29 29 20 28 63 64 72 20 6b 73  ks) b))) (cdr ks
4960: 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )).             
4970: 20 20 20 20 20 20 20 28 63 6f 6e 73 20 28 63 61         (cons (ca
4980: 72 20 6b 73 29 20 28 64 2f 6e 6b 20 28 2b 20 75  r ks) (d/nk (+ u
4990: 20 31 29 20 28 63 64 72 20 6b 73 29 29 29 29 29   1) (cdr ks)))))
49a0: 29 29 29 29 29 0a                                ))))).