Hex Artifact Content
Not logged in

Artifact b101d550f6d9d4afc20f2226c49fff13373e3f28:


0000: 3b 3b 3b 20 61 72 72 61 79 20 74 65 73 74 0a 3b  ;;; array test.;
0010: 3b 3b 20 32 30 30 31 20 4a 75 73 73 69 20 50 69  ;; 2001 Jussi Pi
0020: 69 74 75 6c 61 69 6e 65 6e 0a 0a 28 64 65 66 69  itulainen..(defi
0030: 6e 65 20 70 61 73 74 0a 20 20 28 6c 65 74 20 28  ne past.  (let (
0040: 28 73 74 6f 6e 65 73 20 27 28 29 29 29 0a 20 20  (stones '())).  
0050: 20 20 28 6c 61 6d 62 64 61 20 73 74 6f 6e 65 0a    (lambda stone.
0060: 20 20 20 20 20 20 28 69 66 20 28 6e 75 6c 6c 3f        (if (null?
0070: 20 73 74 6f 6e 65 29 0a 20 20 20 20 20 20 20 20   stone).        
0080: 20 20 28 72 65 76 65 72 73 65 20 73 74 6f 6e 65    (reverse stone
0090: 73 29 0a 20 20 20 20 20 20 20 20 20 20 28 73 65  s).          (se
00a0: 74 21 20 73 74 6f 6e 65 73 20 28 63 6f 6e 73 20  t! stones (cons 
00b0: 28 61 70 70 6c 79 20 28 6c 61 6d 62 64 61 20 28  (apply (lambda (
00c0: 73 74 6f 6e 65 29 20 73 74 6f 6e 65 29 20 73 74  stone) stone) st
00d0: 6f 6e 65 29 20 73 74 6f 6e 65 73 29 29 29 29 29  one) stones)))))
00e0: 29 0a 0a 28 64 65 66 69 6e 65 20 28 74 61 69 6c  )..(define (tail
00f0: 20 6e 29 0a 20 20 28 69 66 20 28 3c 20 6e 20 28   n).  (if (< n (
0100: 6c 65 6e 67 74 68 20 28 70 61 73 74 29 29 29 0a  length (past))).
0110: 20 20 20 20 20 20 28 6c 69 73 74 2d 74 61 69 6c        (list-tail
0120: 20 28 70 61 73 74 29 20 28 2d 20 28 6c 65 6e 67   (past) (- (leng
0130: 74 68 20 28 70 61 73 74 29 29 20 6e 29 29 0a 20  th (past)) n)). 
0140: 20 20 20 20 20 28 70 61 73 74 29 29 29 0a 0a 3b       (past)))..;
0150: 3b 3b 20 53 69 6d 70 6c 65 20 74 65 73 74 73 0a  ;; Simple tests.
0160: 0a 28 6f 72 20 28 61 6e 64 20 28 73 68 61 70 65  .(or (and (shape
0170: 29 0a 20 20 20 20 20 20 20 20 20 28 73 68 61 70  ).         (shap
0180: 65 20 2d 31 20 2d 31 29 0a 20 20 20 20 20 20 20  e -1 -1).       
0190: 20 20 28 73 68 61 70 65 20 2d 31 20 30 29 0a 20    (shape -1 0). 
01a0: 20 20 20 20 20 20 20 20 28 73 68 61 70 65 20 2d          (shape -
01b0: 31 20 31 29 0a 20 20 20 20 20 20 20 20 20 28 73  1 1).         (s
01c0: 68 61 70 65 20 31 20 32 20 33 20 34 20 35 20 36  hape 1 2 3 4 5 6
01d0: 20 37 20 38 20 31 20 32 20 33 20 34 20 35 20 36   7 8 1 2 3 4 5 6
01e0: 20 37 20 38 20 31 20 32 20 33 20 34 20 35 20 36   7 8 1 2 3 4 5 6
01f0: 20 37 20 38 29 29 0a 20 20 20 20 28 65 72 72 6f   7 8)).    (erro
0200: 72 20 22 28 73 68 61 70 65 20 2e 2e 2e 29 20 66  r "(shape ...) f
0210: 61 69 6c 65 64 22 29 29 0a 0a 28 70 61 73 74 20  ailed"))..(past 
0220: 22 73 68 61 70 65 22 29 0a 0a 28 6f 72 20 28 61  "shape")..(or (a
0230: 6e 64 20 28 6d 61 6b 65 2d 61 72 72 61 79 20 28  nd (make-array (
0240: 73 68 61 70 65 29 29 0a 20 20 20 20 20 20 20 20  shape)).        
0250: 20 28 6d 61 6b 65 2d 61 72 72 61 79 20 28 73 68   (make-array (sh
0260: 61 70 65 29 20 2a 29 0a 20 20 20 20 20 20 20 20  ape) *).        
0270: 20 28 6d 61 6b 65 2d 61 72 72 61 79 20 28 73 68   (make-array (sh
0280: 61 70 65 20 2d 31 20 2d 31 29 29 0a 20 20 20 20  ape -1 -1)).    
0290: 20 20 20 20 20 28 6d 61 6b 65 2d 61 72 72 61 79       (make-array
02a0: 20 28 73 68 61 70 65 20 2d 31 20 2d 31 29 20 2a   (shape -1 -1) *
02b0: 29 0a 20 20 20 20 20 20 20 20 20 28 6d 61 6b 65  ).         (make
02c0: 2d 61 72 72 61 79 20 28 73 68 61 70 65 20 2d 31  -array (shape -1
02d0: 20 31 29 29 0a 20 20 20 20 20 20 20 20 20 28 6d   1)).         (m
02e0: 61 6b 65 2d 61 72 72 61 79 20 28 73 68 61 70 65  ake-array (shape
02f0: 20 31 20 32 20 33 20 34 20 35 20 36 20 37 20 38   1 2 3 4 5 6 7 8
0300: 20 31 20 32 20 33 20 34 20 35 20 36 20 37 20 38   1 2 3 4 5 6 7 8
0310: 20 31 20 32 20 33 20 34 29 20 2a 29 29 0a 20 20   1 2 3 4) *)).  
0320: 20 20 28 65 72 72 6f 72 20 22 28 6d 61 6b 65 2d    (error "(make-
0330: 61 72 72 61 79 20 28 73 68 61 70 65 20 2e 2e 2e  array (shape ...
0340: 29 20 5b 6f 5d 29 20 66 61 69 6c 65 64 22 29 29  ) [o]) failed"))
0350: 0a 0a 28 70 61 73 74 20 22 6d 61 6b 65 2d 61 72  ..(past "make-ar
0360: 72 61 79 22 29 0a 0a 28 6f 72 20 28 61 6e 64 20  ray")..(or (and 
0370: 28 61 72 72 61 79 20 28 73 68 61 70 65 29 20 2a  (array (shape) *
0380: 29 0a 20 20 20 20 20 20 20 20 20 28 61 72 72 61  ).         (arra
0390: 79 20 28 73 68 61 70 65 20 2d 31 20 2d 31 29 29  y (shape -1 -1))
03a0: 0a 20 20 20 20 20 20 20 20 20 28 61 72 72 61 79  .         (array
03b0: 20 28 73 68 61 70 65 20 2d 31 20 31 29 20 2a 20   (shape -1 1) * 
03c0: 2a 29 0a 20 20 20 20 20 20 20 20 20 28 61 72 72  *).         (arr
03d0: 61 79 20 28 73 68 61 70 65 20 31 20 32 20 33 20  ay (shape 1 2 3 
03e0: 34 20 35 20 36 20 37 20 38 20 31 20 32 20 33 20  4 5 6 7 8 1 2 3 
03f0: 34 20 35 20 36 20 37 20 38 29 20 2a 29 29 0a 20  4 5 6 7 8) *)). 
0400: 20 20 20 28 65 72 72 6f 72 20 22 28 61 72 72 61     (error "(arra
0410: 79 20 28 73 68 61 70 65 20 2e 2e 2e 29 20 2e 2e  y (shape ...) ..
0420: 2e 29 20 66 61 69 6c 65 64 22 29 29 0a 0a 28 70  .) failed"))..(p
0430: 61 73 74 20 22 61 72 72 61 79 22 29 0a 0a 28 6f  ast "array")..(o
0440: 72 20 28 61 6e 64 20 28 3d 20 28 61 72 72 61 79  r (and (= (array
0450: 2d 72 61 6e 6b 20 28 73 68 61 70 65 29 29 20 32  -rank (shape)) 2
0460: 29 0a 20 20 20 20 20 20 20 20 20 28 3d 20 28 61  ).         (= (a
0470: 72 72 61 79 2d 72 61 6e 6b 20 28 73 68 61 70 65  rray-rank (shape
0480: 20 2d 31 20 2d 31 29 29 20 32 29 0a 20 20 20 20   -1 -1)) 2).    
0490: 20 20 20 20 20 28 3d 20 28 61 72 72 61 79 2d 72       (= (array-r
04a0: 61 6e 6b 20 28 73 68 61 70 65 20 2d 31 20 31 29  ank (shape -1 1)
04b0: 29 20 32 29 0a 20 20 20 20 20 20 20 20 20 28 3d  ) 2).         (=
04c0: 20 28 61 72 72 61 79 2d 72 61 6e 6b 20 28 73 68   (array-rank (sh
04d0: 61 70 65 20 31 20 32 20 33 20 34 20 35 20 36 20  ape 1 2 3 4 5 6 
04e0: 37 20 38 29 29 20 32 29 29 0a 20 20 20 20 28 65  7 8)) 2)).    (e
04f0: 72 72 6f 72 20 22 28 61 72 72 61 79 2d 72 61 6e  rror "(array-ran
0500: 6b 20 28 73 68 61 70 65 20 2e 2e 2e 29 29 20 66  k (shape ...)) f
0510: 61 69 6c 65 64 22 29 29 0a 0a 28 70 61 73 74 20  ailed"))..(past 
0520: 22 61 72 72 61 79 2d 72 61 6e 6b 20 6f 66 20 73  "array-rank of s
0530: 68 61 70 65 22 29 0a 0a 28 6f 72 20 28 61 6e 64  hape")..(or (and
0540: 20 28 3d 20 28 61 72 72 61 79 2d 72 61 6e 6b 20   (= (array-rank 
0550: 28 6d 61 6b 65 2d 61 72 72 61 79 20 28 73 68 61  (make-array (sha
0560: 70 65 29 29 29 20 30 29 0a 20 20 20 20 20 20 20  pe))) 0).       
0570: 20 20 28 3d 20 28 61 72 72 61 79 2d 72 61 6e 6b    (= (array-rank
0580: 20 28 6d 61 6b 65 2d 61 72 72 61 79 20 28 73 68   (make-array (sh
0590: 61 70 65 20 2d 31 20 2d 31 29 29 29 20 31 29 0a  ape -1 -1))) 1).
05a0: 20 20 20 20 20 20 20 20 20 28 3d 20 28 61 72 72           (= (arr
05b0: 61 79 2d 72 61 6e 6b 20 28 6d 61 6b 65 2d 61 72  ay-rank (make-ar
05c0: 72 61 79 20 28 73 68 61 70 65 20 2d 31 20 31 29  ray (shape -1 1)
05d0: 29 29 20 31 29 0a 20 20 20 20 20 20 20 20 20 28  )) 1).         (
05e0: 3d 20 28 61 72 72 61 79 2d 72 61 6e 6b 20 28 6d  = (array-rank (m
05f0: 61 6b 65 2d 61 72 72 61 79 20 28 73 68 61 70 65  ake-array (shape
0600: 20 31 20 32 20 33 20 34 20 35 20 36 20 37 20 38   1 2 3 4 5 6 7 8
0610: 29 29 29 20 34 29 29 0a 20 20 20 20 28 65 72 72  ))) 4)).    (err
0620: 6f 72 20 22 28 61 72 72 61 79 2d 72 61 6e 6b 20  or "(array-rank 
0630: 28 6d 61 6b 65 2d 61 72 72 61 79 20 2e 2e 2e 29  (make-array ...)
0640: 29 20 66 61 69 6c 65 64 22 29 29 0a 0a 28 70 61  ) failed"))..(pa
0650: 73 74 20 22 61 72 72 61 79 2d 72 61 6e 6b 20 6f  st "array-rank o
0660: 66 20 6d 61 6b 65 2d 61 72 72 61 79 22 29 0a 0a  f make-array")..
0670: 28 6f 72 20 28 61 6e 64 20 28 3d 20 28 61 72 72  (or (and (= (arr
0680: 61 79 2d 72 61 6e 6b 20 28 61 72 72 61 79 20 28  ay-rank (array (
0690: 73 68 61 70 65 29 20 2a 29 29 20 30 29 0a 20 20  shape) *)) 0).  
06a0: 20 20 20 20 20 20 20 28 3d 20 28 61 72 72 61 79         (= (array
06b0: 2d 72 61 6e 6b 20 28 61 72 72 61 79 20 28 73 68  -rank (array (sh
06c0: 61 70 65 20 2d 31 20 2d 31 29 29 29 20 31 29 0a  ape -1 -1))) 1).
06d0: 20 20 20 20 20 20 20 20 20 28 3d 20 28 61 72 72           (= (arr
06e0: 61 79 2d 72 61 6e 6b 20 28 61 72 72 61 79 20 28  ay-rank (array (
06f0: 73 68 61 70 65 20 2d 31 20 31 29 20 2a 20 2a 29  shape -1 1) * *)
0700: 29 20 31 29 0a 20 20 20 20 20 20 20 20 20 28 3d  ) 1).         (=
0710: 20 28 61 72 72 61 79 2d 72 61 6e 6b 20 28 61 72   (array-rank (ar
0720: 72 61 79 20 28 73 68 61 70 65 20 31 20 32 20 33  ray (shape 1 2 3
0730: 20 34 20 35 20 36 20 37 20 38 29 20 2a 29 29 20   4 5 6 7 8) *)) 
0740: 34 29 29 0a 20 20 20 20 28 65 72 72 6f 72 20 22  4)).    (error "
0750: 28 61 72 72 61 79 2d 72 61 6e 6b 20 28 61 72 72  (array-rank (arr
0760: 61 79 20 2e 2e 2e 29 29 20 66 61 69 6c 65 64 22  ay ...)) failed"
0770: 29 29 0a 0a 28 70 61 73 74 20 22 61 72 72 61 79  ))..(past "array
0780: 2d 72 61 6e 6b 20 6f 66 20 61 72 72 61 79 22 29  -rank of array")
0790: 0a 0a 28 6f 72 20 28 61 6e 64 20 28 3d 20 28 61  ..(or (and (= (a
07a0: 72 72 61 79 2d 73 74 61 72 74 20 28 73 68 61 70  rray-start (shap
07b0: 65 20 2d 31 20 2d 31 29 20 30 29 20 30 29 0a 20  e -1 -1) 0) 0). 
07c0: 20 20 20 20 20 20 20 20 28 3d 20 28 61 72 72 61          (= (arra
07d0: 79 2d 73 74 61 72 74 20 28 73 68 61 70 65 20 2d  y-start (shape -
07e0: 31 20 2d 31 29 20 31 29 20 30 29 0a 20 20 20 20  1 -1) 1) 0).    
07f0: 20 20 20 20 20 28 3d 20 28 61 72 72 61 79 2d 73       (= (array-s
0800: 74 61 72 74 20 28 73 68 61 70 65 20 2d 31 20 31  tart (shape -1 1
0810: 29 20 30 29 20 30 29 0a 20 20 20 20 20 20 20 20  ) 0) 0).        
0820: 20 28 3d 20 28 61 72 72 61 79 2d 73 74 61 72 74   (= (array-start
0830: 20 28 73 68 61 70 65 20 2d 31 20 31 29 20 31 29   (shape -1 1) 1)
0840: 20 30 29 0a 20 20 20 20 20 20 20 20 20 28 3d 20   0).         (= 
0850: 28 61 72 72 61 79 2d 73 74 61 72 74 20 28 73 68  (array-start (sh
0860: 61 70 65 20 31 20 32 20 33 20 34 20 35 20 36 20  ape 1 2 3 4 5 6 
0870: 37 20 38 29 20 30 29 20 30 29 0a 20 20 20 20 20  7 8) 0) 0).     
0880: 20 20 20 20 28 3d 20 28 61 72 72 61 79 2d 73 74      (= (array-st
0890: 61 72 74 20 28 73 68 61 70 65 20 31 20 32 20 33  art (shape 1 2 3
08a0: 20 34 20 35 20 36 20 37 20 38 29 20 31 29 20 30   4 5 6 7 8) 1) 0
08b0: 29 29 0a 20 20 20 20 28 65 72 72 6f 72 20 22 28  )).    (error "(
08c0: 61 72 72 61 79 2d 73 74 61 72 74 20 28 73 68 61  array-start (sha
08d0: 70 65 20 2e 2e 2e 29 29 20 66 61 69 6c 65 64 22  pe ...)) failed"
08e0: 29 29 0a 0a 28 70 61 73 74 20 22 61 72 72 61 79  ))..(past "array
08f0: 2d 73 74 61 72 74 20 6f 66 20 73 68 61 70 65 22  -start of shape"
0900: 29 0a 0a 28 6f 72 20 28 61 6e 64 20 28 3d 20 28  )..(or (and (= (
0910: 61 72 72 61 79 2d 65 6e 64 20 28 73 68 61 70 65  array-end (shape
0920: 20 2d 31 20 2d 31 29 20 30 29 20 31 29 0a 20 20   -1 -1) 0) 1).  
0930: 20 20 20 20 20 20 20 28 3d 20 28 61 72 72 61 79         (= (array
0940: 2d 65 6e 64 20 28 73 68 61 70 65 20 2d 31 20 2d  -end (shape -1 -
0950: 31 29 20 31 29 20 32 29 0a 20 20 20 20 20 20 20  1) 1) 2).       
0960: 20 20 28 3d 20 28 61 72 72 61 79 2d 65 6e 64 20    (= (array-end 
0970: 28 73 68 61 70 65 20 2d 31 20 31 29 20 30 29 20  (shape -1 1) 0) 
0980: 31 29 0a 20 20 20 20 20 20 20 20 20 28 3d 20 28  1).         (= (
0990: 61 72 72 61 79 2d 65 6e 64 20 28 73 68 61 70 65  array-end (shape
09a0: 20 2d 31 20 31 29 20 31 29 20 32 29 0a 20 20 20   -1 1) 1) 2).   
09b0: 20 20 20 20 20 20 28 3d 20 28 61 72 72 61 79 2d        (= (array-
09c0: 65 6e 64 20 28 73 68 61 70 65 20 31 20 32 20 33  end (shape 1 2 3
09d0: 20 34 20 35 20 36 20 37 20 38 29 20 30 29 20 34   4 5 6 7 8) 0) 4
09e0: 29 0a 20 20 20 20 20 20 20 20 20 28 3d 20 28 61  ).         (= (a
09f0: 72 72 61 79 2d 65 6e 64 20 28 73 68 61 70 65 20  rray-end (shape 
0a00: 31 20 32 20 33 20 34 20 35 20 36 20 37 20 38 29  1 2 3 4 5 6 7 8)
0a10: 20 31 29 20 32 29 29 0a 20 20 20 20 28 65 72 72   1) 2)).    (err
0a20: 6f 72 20 22 28 61 72 72 61 79 2d 65 6e 64 20 28  or "(array-end (
0a30: 73 68 61 70 65 20 2e 2e 2e 29 29 20 66 61 69 6c  shape ...)) fail
0a40: 65 64 22 29 29 0a 0a 28 70 61 73 74 20 22 61 72  ed"))..(past "ar
0a50: 72 61 79 2d 65 6e 64 20 6f 66 20 73 68 61 70 65  ray-end of shape
0a60: 22 29 0a 0a 28 6f 72 20 28 61 6e 64 20 28 3d 20  ")..(or (and (= 
0a70: 28 61 72 72 61 79 2d 73 74 61 72 74 20 28 6d 61  (array-start (ma
0a80: 6b 65 2d 61 72 72 61 79 20 28 73 68 61 70 65 20  ke-array (shape 
0a90: 2d 31 20 2d 31 29 29 20 30 29 20 2d 31 29 0a 20  -1 -1)) 0) -1). 
0aa0: 20 20 20 20 20 20 20 20 28 3d 20 28 61 72 72 61          (= (arra
0ab0: 79 2d 73 74 61 72 74 20 28 6d 61 6b 65 2d 61 72  y-start (make-ar
0ac0: 72 61 79 20 28 73 68 61 70 65 20 2d 31 20 31 29  ray (shape -1 1)
0ad0: 29 20 30 29 20 2d 31 29 0a 20 20 20 20 20 20 20  ) 0) -1).       
0ae0: 20 20 28 3d 20 28 61 72 72 61 79 2d 73 74 61 72    (= (array-star
0af0: 74 20 28 6d 61 6b 65 2d 61 72 72 61 79 20 28 73  t (make-array (s
0b00: 68 61 70 65 20 31 20 32 20 33 20 34 20 35 20 36  hape 1 2 3 4 5 6
0b10: 20 37 20 38 29 29 20 30 29 20 31 29 0a 20 20 20   7 8)) 0) 1).   
0b20: 20 20 20 20 20 20 28 3d 20 28 61 72 72 61 79 2d        (= (array-
0b30: 73 74 61 72 74 20 28 6d 61 6b 65 2d 61 72 72 61  start (make-arra
0b40: 79 20 28 73 68 61 70 65 20 31 20 32 20 33 20 34  y (shape 1 2 3 4
0b50: 20 35 20 36 20 37 20 38 29 29 20 31 29 20 33 29   5 6 7 8)) 1) 3)
0b60: 0a 20 20 20 20 20 20 20 20 20 28 3d 20 28 61 72  .         (= (ar
0b70: 72 61 79 2d 73 74 61 72 74 20 28 6d 61 6b 65 2d  ray-start (make-
0b80: 61 72 72 61 79 20 28 73 68 61 70 65 20 31 20 32  array (shape 1 2
0b90: 20 33 20 34 20 35 20 36 20 37 20 38 29 29 20 32   3 4 5 6 7 8)) 2
0ba0: 29 20 35 29 0a 20 20 20 20 20 20 20 20 20 28 3d  ) 5).         (=
0bb0: 20 28 61 72 72 61 79 2d 73 74 61 72 74 20 28 6d   (array-start (m
0bc0: 61 6b 65 2d 61 72 72 61 79 20 28 73 68 61 70 65  ake-array (shape
0bd0: 20 31 20 32 20 33 20 34 20 35 20 36 20 37 20 38   1 2 3 4 5 6 7 8
0be0: 29 29 20 33 29 20 37 29 29 0a 20 20 20 20 28 65  )) 3) 7)).    (e
0bf0: 72 72 6f 72 20 22 28 61 72 72 61 79 2d 73 74 61  rror "(array-sta
0c00: 72 74 20 28 6d 61 6b 65 2d 61 72 72 61 79 20 2e  rt (make-array .
0c10: 2e 2e 29 29 20 66 61 69 6c 65 64 22 29 29 0a 0a  ..)) failed"))..
0c20: 28 70 61 73 74 20 22 61 72 72 61 79 2d 73 74 61  (past "array-sta
0c30: 72 74 20 6f 66 20 6d 61 6b 65 2d 61 72 72 61 79  rt of make-array
0c40: 22 29 0a 0a 28 6f 72 20 28 61 6e 64 20 28 3d 20  ")..(or (and (= 
0c50: 28 61 72 72 61 79 2d 65 6e 64 20 28 6d 61 6b 65  (array-end (make
0c60: 2d 61 72 72 61 79 20 28 73 68 61 70 65 20 2d 31  -array (shape -1
0c70: 20 2d 31 29 29 20 30 29 20 2d 31 29 0a 20 20 20   -1)) 0) -1).   
0c80: 20 20 20 20 20 20 28 3d 20 28 61 72 72 61 79 2d        (= (array-
0c90: 65 6e 64 20 28 6d 61 6b 65 2d 61 72 72 61 79 20  end (make-array 
0ca0: 28 73 68 61 70 65 20 2d 31 20 31 29 29 20 30 29  (shape -1 1)) 0)
0cb0: 20 31 29 0a 20 20 20 20 20 20 20 20 20 28 3d 20   1).         (= 
0cc0: 28 61 72 72 61 79 2d 65 6e 64 20 28 6d 61 6b 65  (array-end (make
0cd0: 2d 61 72 72 61 79 20 28 73 68 61 70 65 20 31 20  -array (shape 1 
0ce0: 32 20 33 20 34 20 35 20 36 20 37 20 38 29 29 20  2 3 4 5 6 7 8)) 
0cf0: 30 29 20 32 29 0a 20 20 20 20 20 20 20 20 20 28  0) 2).         (
0d00: 3d 20 28 61 72 72 61 79 2d 65 6e 64 20 28 6d 61  = (array-end (ma
0d10: 6b 65 2d 61 72 72 61 79 20 28 73 68 61 70 65 20  ke-array (shape 
0d20: 31 20 32 20 33 20 34 20 35 20 36 20 37 20 38 29  1 2 3 4 5 6 7 8)
0d30: 29 20 31 29 20 34 29 0a 20 20 20 20 20 20 20 20  ) 1) 4).        
0d40: 20 28 3d 20 28 61 72 72 61 79 2d 65 6e 64 20 28   (= (array-end (
0d50: 6d 61 6b 65 2d 61 72 72 61 79 20 28 73 68 61 70  make-array (shap
0d60: 65 20 31 20 32 20 33 20 34 20 35 20 36 20 37 20  e 1 2 3 4 5 6 7 
0d70: 38 29 29 20 32 29 20 36 29 0a 20 20 20 20 20 20  8)) 2) 6).      
0d80: 20 20 20 28 3d 20 28 61 72 72 61 79 2d 65 6e 64     (= (array-end
0d90: 20 28 6d 61 6b 65 2d 61 72 72 61 79 20 28 73 68   (make-array (sh
0da0: 61 70 65 20 31 20 32 20 33 20 34 20 35 20 36 20  ape 1 2 3 4 5 6 
0db0: 37 20 38 29 29 20 33 29 20 38 29 29 0a 20 20 20  7 8)) 3) 8)).   
0dc0: 20 28 65 72 72 6f 72 20 22 28 61 72 72 61 79 2d   (error "(array-
0dd0: 65 6e 64 20 28 6d 61 6b 65 2d 61 72 72 61 79 20  end (make-array 
0de0: 2e 2e 2e 29 29 20 66 61 69 6c 65 64 22 29 29 0a  ...)) failed")).
0df0: 0a 28 70 61 73 74 20 22 61 72 72 61 79 2d 65 6e  .(past "array-en
0e00: 64 20 6f 66 20 6d 61 6b 65 2d 61 72 72 61 79 22  d of make-array"
0e10: 29 0a 0a 28 6f 72 20 28 61 6e 64 20 28 3d 20 28  )..(or (and (= (
0e20: 61 72 72 61 79 2d 73 74 61 72 74 20 28 61 72 72  array-start (arr
0e30: 61 79 20 28 73 68 61 70 65 20 2d 31 20 2d 31 29  ay (shape -1 -1)
0e40: 29 20 30 29 20 2d 31 29 0a 20 20 20 20 20 20 20  ) 0) -1).       
0e50: 20 20 28 3d 20 28 61 72 72 61 79 2d 73 74 61 72    (= (array-star
0e60: 74 20 28 61 72 72 61 79 20 28 73 68 61 70 65 20  t (array (shape 
0e70: 2d 31 20 31 29 20 2a 20 2a 29 20 30 29 20 2d 31  -1 1) * *) 0) -1
0e80: 29 0a 20 20 20 20 20 20 20 20 20 28 3d 20 28 61  ).         (= (a
0e90: 72 72 61 79 2d 73 74 61 72 74 20 28 61 72 72 61  rray-start (arra
0ea0: 79 20 28 73 68 61 70 65 20 31 20 32 20 33 20 34  y (shape 1 2 3 4
0eb0: 20 35 20 36 20 37 20 38 29 20 2a 29 20 30 29 20   5 6 7 8) *) 0) 
0ec0: 31 29 0a 20 20 20 20 20 20 20 20 20 28 3d 20 28  1).         (= (
0ed0: 61 72 72 61 79 2d 73 74 61 72 74 20 28 61 72 72  array-start (arr
0ee0: 61 79 20 28 73 68 61 70 65 20 31 20 32 20 33 20  ay (shape 1 2 3 
0ef0: 34 20 35 20 36 20 37 20 38 29 20 2a 29 20 31 29  4 5 6 7 8) *) 1)
0f00: 20 33 29 0a 20 20 20 20 20 20 20 20 20 28 3d 20   3).         (= 
0f10: 28 61 72 72 61 79 2d 73 74 61 72 74 20 28 61 72  (array-start (ar
0f20: 72 61 79 20 28 73 68 61 70 65 20 31 20 32 20 33  ray (shape 1 2 3
0f30: 20 34 20 35 20 36 20 37 20 38 29 20 2a 29 20 32   4 5 6 7 8) *) 2
0f40: 29 20 35 29 0a 20 20 20 20 20 20 20 20 20 28 3d  ) 5).         (=
0f50: 20 28 61 72 72 61 79 2d 73 74 61 72 74 20 28 61   (array-start (a
0f60: 72 72 61 79 20 28 73 68 61 70 65 20 31 20 32 20  rray (shape 1 2 
0f70: 33 20 34 20 35 20 36 20 37 20 38 29 20 2a 29 20  3 4 5 6 7 8) *) 
0f80: 33 29 20 37 29 29 0a 20 20 20 20 28 65 72 72 6f  3) 7)).    (erro
0f90: 72 20 22 28 61 72 72 61 79 2d 73 74 61 72 74 20  r "(array-start 
0fa0: 28 61 72 72 61 79 20 2e 2e 2e 29 29 20 66 61 69  (array ...)) fai
0fb0: 6c 65 64 22 29 29 0a 0a 28 70 61 73 74 20 22 61  led"))..(past "a
0fc0: 72 72 61 79 2d 73 74 61 72 74 20 6f 66 20 61 72  rray-start of ar
0fd0: 72 61 79 22 29 0a 0a 28 6f 72 20 28 61 6e 64 20  ray")..(or (and 
0fe0: 28 3d 20 28 61 72 72 61 79 2d 65 6e 64 20 28 61  (= (array-end (a
0ff0: 72 72 61 79 20 28 73 68 61 70 65 20 2d 31 20 2d  rray (shape -1 -
1000: 31 29 29 20 30 29 20 2d 31 29 0a 20 20 20 20 20  1)) 0) -1).     
1010: 20 20 20 20 28 3d 20 28 61 72 72 61 79 2d 65 6e      (= (array-en
1020: 64 20 28 61 72 72 61 79 20 28 73 68 61 70 65 20  d (array (shape 
1030: 2d 31 20 31 29 20 2a 20 2a 29 20 30 29 20 31 29  -1 1) * *) 0) 1)
1040: 0a 20 20 20 20 20 20 20 20 20 28 3d 20 28 61 72  .         (= (ar
1050: 72 61 79 2d 65 6e 64 20 28 61 72 72 61 79 20 28  ray-end (array (
1060: 73 68 61 70 65 20 31 20 32 20 33 20 34 20 35 20  shape 1 2 3 4 5 
1070: 36 20 37 20 38 29 20 2a 29 20 30 29 20 32 29 0a  6 7 8) *) 0) 2).
1080: 20 20 20 20 20 20 20 20 20 28 3d 20 28 61 72 72           (= (arr
1090: 61 79 2d 65 6e 64 20 28 61 72 72 61 79 20 28 73  ay-end (array (s
10a0: 68 61 70 65 20 31 20 32 20 33 20 34 20 35 20 36  hape 1 2 3 4 5 6
10b0: 20 37 20 38 29 20 2a 29 20 31 29 20 34 29 0a 20   7 8) *) 1) 4). 
10c0: 20 20 20 20 20 20 20 20 28 3d 20 28 61 72 72 61          (= (arra
10d0: 79 2d 65 6e 64 20 28 61 72 72 61 79 20 28 73 68  y-end (array (sh
10e0: 61 70 65 20 31 20 32 20 33 20 34 20 35 20 36 20  ape 1 2 3 4 5 6 
10f0: 37 20 38 29 20 2a 29 20 32 29 20 36 29 0a 20 20  7 8) *) 2) 6).  
1100: 20 20 20 20 20 20 20 28 3d 20 28 61 72 72 61 79         (= (array
1110: 2d 65 6e 64 20 28 61 72 72 61 79 20 28 73 68 61  -end (array (sha
1120: 70 65 20 31 20 32 20 33 20 34 20 35 20 36 20 37  pe 1 2 3 4 5 6 7
1130: 20 38 29 20 2a 29 20 33 29 20 38 29 29 0a 20 20   8) *) 3) 8)).  
1140: 20 20 28 65 72 72 6f 72 20 22 28 61 72 72 61 79    (error "(array
1150: 2d 65 6e 64 20 28 61 72 72 61 79 20 2e 2e 2e 29  -end (array ...)
1160: 29 20 66 61 69 6c 65 64 22 29 29 0a 0a 28 70 61  ) failed"))..(pa
1170: 73 74 20 22 61 72 72 61 79 2d 65 6e 64 20 6f 66  st "array-end of
1180: 20 61 72 72 61 79 22 29 0a 0a 28 6f 72 20 28 61   array")..(or (a
1190: 6e 64 20 28 65 71 3f 20 28 61 72 72 61 79 2d 72  nd (eq? (array-r
11a0: 65 66 20 28 6d 61 6b 65 2d 61 72 72 61 79 20 28  ef (make-array (
11b0: 73 68 61 70 65 29 20 27 61 29 29 20 27 61 29 0a  shape) 'a)) 'a).
11c0: 20 20 20 20 20 20 20 20 20 28 65 71 3f 20 28 61           (eq? (a
11d0: 72 72 61 79 2d 72 65 66 20 28 6d 61 6b 65 2d 61  rray-ref (make-a
11e0: 72 72 61 79 20 28 73 68 61 70 65 20 2d 31 20 31  rray (shape -1 1
11f0: 29 20 27 62 29 20 2d 31 29 20 27 62 29 0a 20 20  ) 'b) -1) 'b).  
1200: 20 20 20 20 20 20 20 28 65 71 3f 20 28 61 72 72         (eq? (arr
1210: 61 79 2d 72 65 66 20 28 6d 61 6b 65 2d 61 72 72  ay-ref (make-arr
1220: 61 79 20 28 73 68 61 70 65 20 2d 31 20 31 29 20  ay (shape -1 1) 
1230: 27 63 29 20 30 29 20 27 63 29 0a 20 20 20 20 20  'c) 0) 'c).     
1240: 20 20 20 20 28 65 71 3f 20 28 61 72 72 61 79 2d      (eq? (array-
1250: 72 65 66 20 28 6d 61 6b 65 2d 61 72 72 61 79 20  ref (make-array 
1260: 28 73 68 61 70 65 20 31 20 32 20 33 20 34 20 35  (shape 1 2 3 4 5
1270: 20 36 20 37 20 38 29 20 27 64 29 20 31 20 33 20   6 7 8) 'd) 1 3 
1280: 35 20 37 29 20 27 64 29 29 0a 20 20 20 20 28 65  5 7) 'd)).    (e
1290: 72 72 6f 72 20 22 61 72 72 61 79 2d 72 65 66 20  rror "array-ref 
12a0: 6f 66 20 6d 61 6b 65 2d 61 72 72 61 79 20 77 69  of make-array wi
12b0: 74 68 20 61 72 67 75 6d 65 6e 74 73 20 66 61 69  th arguments fai
12c0: 6c 65 64 22 29 29 0a 0a 28 70 61 73 74 20 22 61  led"))..(past "a
12d0: 72 72 61 79 2d 72 65 66 20 6f 66 20 6d 61 6b 65  rray-ref of make
12e0: 2d 61 72 72 61 79 20 77 69 74 68 20 61 72 67 75  -array with argu
12f0: 6d 65 6e 74 73 22 29 0a 0a 28 6f 72 20 28 61 6e  ments")..(or (an
1300: 64 20 28 65 71 3f 20 28 61 72 72 61 79 2d 72 65  d (eq? (array-re
1310: 66 20 28 6d 61 6b 65 2d 61 72 72 61 79 20 28 73  f (make-array (s
1320: 68 61 70 65 29 20 27 61 29 20 27 23 28 29 29 20  hape) 'a) '#()) 
1330: 27 61 29 0a 20 20 20 20 20 20 20 20 20 28 65 71  'a).         (eq
1340: 3f 20 28 61 72 72 61 79 2d 72 65 66 20 28 6d 61  ? (array-ref (ma
1350: 6b 65 2d 61 72 72 61 79 20 28 73 68 61 70 65 20  ke-array (shape 
1360: 2d 31 20 31 29 20 27 62 29 20 27 23 28 2d 31 29  -1 1) 'b) '#(-1)
1370: 29 20 27 62 29 0a 20 20 20 20 20 20 20 20 20 28  ) 'b).         (
1380: 65 71 3f 20 28 61 72 72 61 79 2d 72 65 66 20 28  eq? (array-ref (
1390: 6d 61 6b 65 2d 61 72 72 61 79 20 28 73 68 61 70  make-array (shap
13a0: 65 20 2d 31 20 31 29 20 27 63 29 20 27 23 28 30  e -1 1) 'c) '#(0
13b0: 29 29 20 27 63 29 0a 20 20 20 20 20 20 20 20 20  )) 'c).         
13c0: 28 65 71 3f 20 28 61 72 72 61 79 2d 72 65 66 20  (eq? (array-ref 
13d0: 28 6d 61 6b 65 2d 61 72 72 61 79 20 28 73 68 61  (make-array (sha
13e0: 70 65 20 31 20 32 20 33 20 34 20 35 20 36 20 37  pe 1 2 3 4 5 6 7
13f0: 20 38 29 20 27 64 29 0a 20 20 20 20 20 20 20 20   8) 'd).        
1400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1410: 20 27 23 28 31 20 33 20 35 20 37 29 29 0a 20 20   '#(1 3 5 7)).  
1420: 20 20 20 20 20 20 20 20 20 20 20 20 27 64 29 29              'd))
1430: 0a 20 20 20 20 28 65 72 72 6f 72 20 22 61 72 72  .    (error "arr
1440: 61 79 2d 72 65 66 20 6f 66 20 6d 61 6b 65 2d 61  ay-ref of make-a
1450: 72 72 61 79 20 77 69 74 68 20 76 65 63 74 6f 72  rray with vector
1460: 20 66 61 69 6c 65 64 22 29 29 0a 0a 28 70 61 73   failed"))..(pas
1470: 74 20 22 61 72 72 61 79 2d 72 65 66 20 6f 66 20  t "array-ref of 
1480: 6d 61 6b 65 2d 61 72 72 61 79 20 77 69 74 68 20  make-array with 
1490: 76 65 63 74 6f 72 22 29 0a 0a 28 6f 72 20 28 61  vector")..(or (a
14a0: 6e 64 20 28 65 71 3f 20 28 61 72 72 61 79 2d 72  nd (eq? (array-r
14b0: 65 66 20 28 6d 61 6b 65 2d 61 72 72 61 79 20 28  ef (make-array (
14c0: 73 68 61 70 65 29 20 27 61 29 0a 20 20 20 20 20  shape) 'a).     
14d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e0: 20 20 20 20 28 61 72 72 61 79 20 28 73 68 61 70      (array (shap
14f0: 65 20 30 20 30 29 29 29 0a 20 20 20 20 20 20 20  e 0 0))).       
1500: 20 20 20 20 20 20 20 27 61 29 0a 20 20 20 20 20         'a).     
1510: 20 20 20 20 28 65 71 3f 20 28 61 72 72 61 79 2d      (eq? (array-
1520: 72 65 66 20 28 6d 61 6b 65 2d 61 72 72 61 79 20  ref (make-array 
1530: 28 73 68 61 70 65 20 2d 31 20 31 29 20 27 62 29  (shape -1 1) 'b)
1540: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1550: 20 20 20 20 20 20 20 20 20 20 28 61 72 72 61 79            (array
1560: 20 28 73 68 61 70 65 20 30 20 31 29 20 2d 31 29   (shape 0 1) -1)
1570: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
1580: 27 62 29 0a 20 20 20 20 20 20 20 20 20 28 65 71  'b).         (eq
1590: 3f 20 28 61 72 72 61 79 2d 72 65 66 20 28 6d 61  ? (array-ref (ma
15a0: 6b 65 2d 61 72 72 61 79 20 28 73 68 61 70 65 20  ke-array (shape 
15b0: 2d 31 20 31 29 20 27 63 29 0a 20 20 20 20 20 20  -1 1) 'c).      
15c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d0: 20 20 20 28 61 72 72 61 79 20 28 73 68 61 70 65     (array (shape
15e0: 20 30 20 31 29 20 30 29 29 0a 20 20 20 20 20 20   0 1) 0)).      
15f0: 20 20 20 20 20 20 20 20 27 63 29 0a 20 20 20 20          'c).    
1600: 20 20 20 20 20 28 65 71 3f 20 28 61 72 72 61 79       (eq? (array
1610: 2d 72 65 66 20 28 6d 61 6b 65 2d 61 72 72 61 79  -ref (make-array
1620: 20 28 73 68 61 70 65 20 31 20 32 20 33 20 34 20   (shape 1 2 3 4 
1630: 35 20 36 20 37 20 38 29 20 27 64 29 0a 20 20 20  5 6 7 8) 'd).   
1640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1650: 20 20 20 20 20 20 28 61 72 72 61 79 20 28 73 68        (array (sh
1660: 61 70 65 20 30 20 34 29 20 31 20 33 20 35 20 37  ape 0 4) 1 3 5 7
1670: 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )).             
1680: 20 27 64 29 29 0a 20 20 20 20 28 65 72 72 6f 72   'd)).    (error
1690: 20 22 28 61 72 72 61 79 2d 72 65 66 20 6f 66 20   "(array-ref of 
16a0: 6d 61 6b 65 2d 61 72 72 61 79 20 77 69 74 68 20  make-array with 
16b0: 61 72 72 61 79 20 66 61 69 6c 65 64 22 29 29 0a  array failed")).
16c0: 0a 28 70 61 73 74 20 22 61 72 72 61 79 2d 72 65  .(past "array-re
16d0: 66 20 6f 66 20 6d 61 6b 65 2d 61 72 72 61 79 20  f of make-array 
16e0: 77 69 74 68 20 61 72 72 61 79 22 29 0a 0a 28 6f  with array")..(o
16f0: 72 20 28 61 6e 64 20 28 6c 65 74 20 28 28 61 72  r (and (let ((ar
1700: 72 20 28 6d 61 6b 65 2d 61 72 72 61 79 20 28 73  r (make-array (s
1710: 68 61 70 65 29 20 27 6f 29 29 29 0a 20 20 20 20  hape) 'o))).    
1720: 20 20 20 20 20 20 20 28 61 72 72 61 79 2d 73 65         (array-se
1730: 74 21 20 61 72 72 20 27 61 29 0a 20 20 20 20 20  t! arr 'a).     
1740: 20 20 20 20 20 20 28 65 71 3f 20 28 61 72 72 61        (eq? (arra
1750: 79 2d 72 65 66 20 61 72 72 29 20 27 61 29 29 0a  y-ref arr) 'a)).
1760: 20 20 20 20 20 20 20 20 20 28 6c 65 74 20 28 28           (let ((
1770: 61 72 72 20 28 6d 61 6b 65 2d 61 72 72 61 79 20  arr (make-array 
1780: 28 73 68 61 70 65 20 2d 31 20 31 29 20 27 6f 29  (shape -1 1) 'o)
1790: 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 28 61  )).           (a
17a0: 72 72 61 79 2d 73 65 74 21 20 61 72 72 20 2d 31  rray-set! arr -1
17b0: 20 27 62 29 0a 20 20 20 20 20 20 20 20 20 20 20   'b).           
17c0: 28 61 72 72 61 79 2d 73 65 74 21 20 61 72 72 20  (array-set! arr 
17d0: 30 20 27 63 29 0a 20 20 20 20 20 20 20 20 20 20  0 'c).          
17e0: 20 28 61 6e 64 20 28 65 71 3f 20 28 61 72 72 61   (and (eq? (arra
17f0: 79 2d 72 65 66 20 61 72 72 20 2d 31 29 20 27 62  y-ref arr -1) 'b
1800: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
1810: 20 20 28 65 71 3f 20 28 61 72 72 61 79 2d 72 65    (eq? (array-re
1820: 66 20 61 72 72 20 30 29 20 27 63 29 29 29 0a 20  f arr 0) 'c))). 
1830: 20 20 20 20 20 20 20 20 28 6c 65 74 20 28 28 61          (let ((a
1840: 72 72 20 28 6d 61 6b 65 2d 61 72 72 61 79 20 28  rr (make-array (
1850: 73 68 61 70 65 20 31 20 32 20 33 20 34 20 35 20  shape 1 2 3 4 5 
1860: 36 20 37 20 38 29 20 27 6f 29 29 29 0a 20 20 20  6 7 8) 'o))).   
1870: 20 20 20 20 20 20 20 20 28 61 72 72 61 79 2d 73          (array-s
1880: 65 74 21 20 61 72 72 20 31 20 33 20 35 20 37 20  et! arr 1 3 5 7 
1890: 27 64 29 0a 20 20 20 20 20 20 20 20 20 20 20 28  'd).           (
18a0: 65 71 3f 20 28 61 72 72 61 79 2d 72 65 66 20 61  eq? (array-ref a
18b0: 72 72 20 31 20 33 20 35 20 37 29 20 27 64 29 29  rr 1 3 5 7) 'd))
18c0: 29 0a 20 20 20 20 28 65 72 72 6f 72 20 22 61 72  ).    (error "ar
18d0: 72 61 79 2d 73 65 74 21 20 77 69 74 68 20 61 72  ray-set! with ar
18e0: 67 75 6d 65 6e 74 73 20 66 61 69 6c 65 64 22 29  guments failed")
18f0: 29 0a 0a 28 70 61 73 74 20 22 61 72 72 61 79 2d  )..(past "array-
1900: 73 65 74 21 20 6f 66 20 6d 61 6b 65 2d 61 72 72  set! of make-arr
1910: 61 79 20 77 69 74 68 20 61 72 67 75 6d 65 6e 74  ay with argument
1920: 73 22 29 0a 0a 28 6f 72 20 28 61 6e 64 20 28 6c  s")..(or (and (l
1930: 65 74 20 28 28 61 72 72 20 28 6d 61 6b 65 2d 61  et ((arr (make-a
1940: 72 72 61 79 20 28 73 68 61 70 65 29 20 27 6f 29  rray (shape) 'o)
1950: 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 28 61  )).           (a
1960: 72 72 61 79 2d 73 65 74 21 20 61 72 72 20 27 23  rray-set! arr '#
1970: 28 29 20 27 61 29 0a 20 20 20 20 20 20 20 20 20  () 'a).         
1980: 20 20 28 65 71 3f 20 28 61 72 72 61 79 2d 72 65    (eq? (array-re
1990: 66 20 61 72 72 29 20 27 61 29 29 0a 20 20 20 20  f arr) 'a)).    
19a0: 20 20 20 20 20 28 6c 65 74 20 28 28 61 72 72 20       (let ((arr 
19b0: 28 6d 61 6b 65 2d 61 72 72 61 79 20 28 73 68 61  (make-array (sha
19c0: 70 65 20 2d 31 20 31 29 20 27 6f 29 29 29 0a 20  pe -1 1) 'o))). 
19d0: 20 20 20 20 20 20 20 20 20 20 28 61 72 72 61 79            (array
19e0: 2d 73 65 74 21 20 61 72 72 20 27 23 28 2d 31 29  -set! arr '#(-1)
19f0: 20 27 62 29 0a 20 20 20 20 20 20 20 20 20 20 20   'b).           
1a00: 28 61 72 72 61 79 2d 73 65 74 21 20 61 72 72 20  (array-set! arr 
1a10: 27 23 28 30 29 20 27 63 29 0a 20 20 20 20 20 20  '#(0) 'c).      
1a20: 20 20 20 20 20 28 61 6e 64 20 28 65 71 3f 20 28       (and (eq? (
1a30: 61 72 72 61 79 2d 72 65 66 20 61 72 72 20 2d 31  array-ref arr -1
1a40: 29 20 27 62 29 0a 20 20 20 20 20 20 20 20 20 20  ) 'b).          
1a50: 20 20 20 20 20 20 28 65 71 3f 20 28 61 72 72 61        (eq? (arra
1a60: 79 2d 72 65 66 20 61 72 72 20 30 29 20 27 63 29  y-ref arr 0) 'c)
1a70: 29 29 0a 20 20 20 20 20 20 20 20 20 28 6c 65 74  )).         (let
1a80: 20 28 28 61 72 72 20 28 6d 61 6b 65 2d 61 72 72   ((arr (make-arr
1a90: 61 79 20 28 73 68 61 70 65 20 31 20 32 20 33 20  ay (shape 1 2 3 
1aa0: 34 20 35 20 36 20 37 20 38 29 20 27 6f 29 29 29  4 5 6 7 8) 'o)))
1ab0: 0a 20 20 20 20 20 20 20 20 20 20 20 28 61 72 72  .           (arr
1ac0: 61 79 2d 73 65 74 21 20 61 72 72 20 27 23 28 31  ay-set! arr '#(1
1ad0: 20 33 20 35 20 37 29 20 27 64 29 0a 20 20 20 20   3 5 7) 'd).    
1ae0: 20 20 20 20 20 20 20 28 65 71 3f 20 28 61 72 72         (eq? (arr
1af0: 61 79 2d 72 65 66 20 61 72 72 20 31 20 33 20 35  ay-ref arr 1 3 5
1b00: 20 37 29 20 27 64 29 29 29 0a 20 20 20 20 28 65   7) 'd))).    (e
1b10: 72 72 6f 72 20 22 61 72 72 61 79 2d 73 65 74 21  rror "array-set!
1b20: 20 77 69 74 68 20 76 65 63 74 6f 72 20 66 61 69   with vector fai
1b30: 6c 65 64 22 29 29 0a 0a 28 70 61 73 74 20 22 61  led"))..(past "a
1b40: 72 72 61 79 2d 73 65 74 21 20 6f 66 20 6d 61 6b  rray-set! of mak
1b50: 65 2d 61 72 72 61 79 20 77 69 74 68 20 76 65 63  e-array with vec
1b60: 74 6f 72 22 29 0a 0a 28 6f 72 20 28 61 6e 64 20  tor")..(or (and 
1b70: 28 6c 65 74 20 28 28 61 72 72 20 28 6d 61 6b 65  (let ((arr (make
1b80: 2d 61 72 72 61 79 20 28 73 68 61 70 65 29 20 27  -array (shape) '
1b90: 6f 29 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  o))).           
1ba0: 28 61 72 72 61 79 2d 73 65 74 21 20 61 72 72 20  (array-set! arr 
1bb0: 27 61 29 0a 20 20 20 20 20 20 20 20 20 20 20 28  'a).           (
1bc0: 65 71 3f 20 28 61 72 72 61 79 2d 72 65 66 20 61  eq? (array-ref a
1bd0: 72 72 29 20 27 61 29 29 0a 20 20 20 20 20 20 20  rr) 'a)).       
1be0: 20 20 28 6c 65 74 20 28 28 61 72 72 20 28 6d 61    (let ((arr (ma
1bf0: 6b 65 2d 61 72 72 61 79 20 28 73 68 61 70 65 20  ke-array (shape 
1c00: 2d 31 20 31 29 20 27 6f 29 29 29 0a 20 20 20 20  -1 1) 'o))).    
1c10: 20 20 20 20 20 20 20 28 61 72 72 61 79 2d 73 65         (array-se
1c20: 74 21 20 61 72 72 20 28 61 72 72 61 79 20 28 73  t! arr (array (s
1c30: 68 61 70 65 20 30 20 31 29 20 2d 31 29 20 27 62  hape 0 1) -1) 'b
1c40: 29 0a 20 20 20 20 20 20 20 20 20 20 20 28 61 72  ).           (ar
1c50: 72 61 79 2d 73 65 74 21 20 61 72 72 20 28 61 72  ray-set! arr (ar
1c60: 72 61 79 20 28 73 68 61 70 65 20 30 20 31 29 20  ray (shape 0 1) 
1c70: 30 29 20 27 63 29 0a 20 20 20 20 20 20 20 20 20  0) 'c).         
1c80: 20 20 28 61 6e 64 20 28 65 71 3f 20 28 61 72 72    (and (eq? (arr
1c90: 61 79 2d 72 65 66 20 61 72 72 20 2d 31 29 20 27  ay-ref arr -1) '
1ca0: 62 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b).             
1cb0: 20 20 20 28 65 71 3f 20 28 61 72 72 61 79 2d 72     (eq? (array-r
1cc0: 65 66 20 61 72 72 20 30 29 20 27 63 29 29 29 0a  ef arr 0) 'c))).
1cd0: 20 20 20 20 20 20 20 20 20 28 6c 65 74 20 28 28           (let ((
1ce0: 61 72 72 20 28 6d 61 6b 65 2d 61 72 72 61 79 20  arr (make-array 
1cf0: 28 73 68 61 70 65 20 31 20 32 20 33 20 34 20 35  (shape 1 2 3 4 5
1d00: 20 36 20 37 20 38 29 20 27 6f 29 29 29 0a 20 20   6 7 8) 'o))).  
1d10: 20 20 20 20 20 20 20 20 20 28 61 72 72 61 79 2d           (array-
1d20: 73 65 74 21 20 61 72 72 20 28 61 72 72 61 79 20  set! arr (array 
1d30: 28 73 68 61 70 65 20 30 20 34 29 20 31 20 33 20  (shape 0 4) 1 3 
1d40: 35 20 37 29 20 27 64 29 0a 20 20 20 20 20 20 20  5 7) 'd).       
1d50: 20 20 20 20 28 65 71 3f 20 28 61 72 72 61 79 2d      (eq? (array-
1d60: 72 65 66 20 61 72 72 20 31 20 33 20 35 20 37 29  ref arr 1 3 5 7)
1d70: 20 27 64 29 29 29 0a 20 20 20 20 28 65 72 72 6f   'd))).    (erro
1d80: 72 20 22 61 72 72 61 79 2d 73 65 74 21 20 77 69  r "array-set! wi
1d90: 74 68 20 61 72 67 75 6d 65 6e 74 73 20 66 61 69  th arguments fai
1da0: 6c 65 64 22 29 29 0a 0a 28 70 61 73 74 20 22 61  led"))..(past "a
1db0: 72 72 61 79 2d 73 65 74 21 20 6f 66 20 6d 61 6b  rray-set! of mak
1dc0: 65 2d 61 72 72 61 79 20 77 69 74 68 20 61 72 72  e-array with arr
1dd0: 61 79 22 29 0a 0a 3b 3b 3b 20 53 68 61 72 65 20  ay")..;;; Share 
1de0: 61 6e 64 20 63 68 61 6e 67 65 3a 0a 3b 3b 3b 0a  and change:.;;;.
1df0: 3b 3b 3b 20 20 6f 72 67 20 20 20 20 20 62 72 6b  ;;;  org     brk
1e00: 20 20 20 20 20 73 77 70 20 20 20 20 20 20 20 20       swp        
1e10: 20 20 20 20 62 6f 78 0a 3b 3b 3b 0a 3b 3b 3b 20      box.;;;.;;; 
1e20: 20 20 30 20 31 20 20 20 20 20 31 20 32 20 20 20    0 1     1 2   
1e30: 20 20 35 20 36 0a 3b 3b 3b 20 36 20 61 20 62 20    5 6.;;; 6 a b 
1e40: 20 20 32 20 61 20 62 20 20 20 33 20 64 20 63 20    2 a b   3 d c 
1e50: 20 20 30 20 32 20 34 20 36 20 38 3a 20 65 0a 3b    0 2 4 6 8: e.;
1e60: 3b 3b 20 37 20 63 20 64 20 20 20 33 20 65 20 66  ;; 7 c d   3 e f
1e70: 20 20 20 34 20 66 20 65 0a 3b 3b 3b 20 38 20 65     4 f e.;;; 8 e
1e80: 20 66 0a 0a 28 6f 72 20 28 6c 65 74 2a 20 28 28   f..(or (let* ((
1e90: 6f 72 67 20 28 61 72 72 61 79 20 28 73 68 61 70  org (array (shap
1ea0: 65 20 36 20 39 20 30 20 32 29 20 27 61 20 27 62  e 6 9 0 2) 'a 'b
1eb0: 20 27 63 20 27 64 20 27 65 20 27 66 29 29 0a 20   'c 'd 'e 'f)). 
1ec0: 20 20 20 20 20 20 20 20 20 20 28 62 72 6b 20 28            (brk (
1ed0: 73 68 61 72 65 2d 61 72 72 61 79 0a 20 20 20 20  share-array.    
1ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 72 67               org
1ef0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f00: 20 20 28 73 68 61 70 65 20 32 20 34 20 31 20 33    (shape 2 4 1 3
1f10: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
1f20: 20 20 20 28 6c 61 6d 62 64 61 20 28 72 20 6b 29     (lambda (r k)
1f30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f40: 20 20 20 20 28 76 61 6c 75 65 73 0a 20 20 20 20      (values.    
1f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f60: 28 2b 20 36 20 28 2a 20 32 20 28 2d 20 72 20 32  (+ 6 (* 2 (- r 2
1f70: 29 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))).            
1f80: 20 20 20 20 20 20 20 20 28 2d 20 6b 20 31 29 29          (- k 1))
1f90: 29 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 28  ))).           (
1fa0: 73 77 70 20 28 73 68 61 72 65 2d 61 72 72 61 79  swp (share-array
1fb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1fc0: 20 20 6f 72 67 0a 20 20 20 20 20 20 20 20 20 20    org.          
1fd0: 20 20 20 20 20 20 20 28 73 68 61 70 65 20 33 20         (shape 3 
1fe0: 35 20 35 20 37 29 0a 20 20 20 20 20 20 20 20 20  5 5 7).         
1ff0: 20 20 20 20 20 20 20 20 28 6c 61 6d 62 64 61 20          (lambda 
2000: 28 72 20 6b 29 0a 20 20 20 20 20 20 20 20 20 20  (r k).          
2010: 20 20 20 20 20 20 20 20 20 28 76 61 6c 75 65 73           (values
2020: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2030: 20 20 20 20 20 28 2b 20 37 20 28 2d 20 72 20 33       (+ 7 (- r 3
2040: 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )).             
2050: 20 20 20 20 20 20 20 28 2d 20 31 20 28 2d 20 6b         (- 1 (- k
2060: 20 35 29 29 29 29 29 29 0a 20 20 20 20 20 20 20   5)))))).       
2070: 20 20 20 20 28 62 6f 78 20 28 73 68 61 72 65 2d      (box (share-
2080: 61 72 72 61 79 0a 20 20 20 20 20 20 20 20 20 20  array.          
2090: 20 20 20 20 20 20 20 73 77 70 0a 20 20 20 20 20         swp.     
20a0: 20 20 20 20 20 20 20 20 20 20 20 20 28 73 68 61              (sha
20b0: 70 65 20 30 20 31 20 32 20 33 20 34 20 35 20 36  pe 0 1 2 3 4 5 6
20c0: 20 37 20 38 20 39 29 0a 20 20 20 20 20 20 20 20   7 8 9).        
20d0: 20 20 20 20 20 20 20 20 20 28 6c 61 6d 62 64 61           (lambda
20e0: 20 5f 20 28 76 61 6c 75 65 73 20 34 20 36 29 29   _ (values 4 6))
20f0: 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 28 6f  )).           (o
2100: 72 67 2d 63 6f 6e 74 65 6e 74 73 20 28 6c 61 6d  rg-contents (lam
2110: 62 64 61 20 28 29 0a 20 20 20 20 20 20 20 20 20  bda ().         
2120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2130: 20 20 28 6c 69 73 74 20 28 61 72 72 61 79 2d 72    (list (array-r
2140: 65 66 20 6f 72 67 20 36 20 30 29 20 28 61 72 72  ef org 6 0) (arr
2150: 61 79 2d 72 65 66 20 6f 72 67 20 36 20 31 29 0a  ay-ref org 6 1).
2160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2180: 20 28 61 72 72 61 79 2d 72 65 66 20 6f 72 67 20   (array-ref org 
2190: 37 20 30 29 20 28 61 72 72 61 79 2d 72 65 66 20  7 0) (array-ref 
21a0: 6f 72 67 20 37 20 31 29 0a 20 20 20 20 20 20 20  org 7 1).       
21b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c0: 20 20 20 20 20 20 20 20 20 20 28 61 72 72 61 79            (array
21d0: 2d 72 65 66 20 6f 72 67 20 38 20 30 29 20 28 61  -ref org 8 0) (a
21e0: 72 72 61 79 2d 72 65 66 20 6f 72 67 20 38 20 31  rray-ref org 8 1
21f0: 29 29 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  )))).           
2200: 28 62 72 6b 2d 63 6f 6e 74 65 6e 74 73 20 28 6c  (brk-contents (l
2210: 61 6d 62 64 61 20 28 29 0a 20 20 20 20 20 20 20  ambda ().       
2220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2230: 20 20 20 20 28 6c 69 73 74 20 28 61 72 72 61 79      (list (array
2240: 2d 72 65 66 20 62 72 6b 20 32 20 31 29 20 28 61  -ref brk 2 1) (a
2250: 72 72 61 79 2d 72 65 66 20 62 72 6b 20 32 20 32  rray-ref brk 2 2
2260: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
2270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2280: 20 20 20 28 61 72 72 61 79 2d 72 65 66 20 62 72     (array-ref br
2290: 6b 20 33 20 31 29 20 28 61 72 72 61 79 2d 72 65  k 3 1) (array-re
22a0: 66 20 62 72 6b 20 33 20 32 29 29 29 29 0a 20 20  f brk 3 2)))).  
22b0: 20 20 20 20 20 20 20 20 20 28 73 77 70 2d 63 6f           (swp-co
22c0: 6e 74 65 6e 74 73 20 28 6c 61 6d 62 64 61 20 28  ntents (lambda (
22d0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
22e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6c 69               (li
22f0: 73 74 20 28 61 72 72 61 79 2d 72 65 66 20 73 77  st (array-ref sw
2300: 70 20 33 20 35 29 20 28 61 72 72 61 79 2d 72 65  p 3 5) (array-re
2310: 66 20 73 77 70 20 33 20 36 29 0a 20 20 20 20 20  f swp 3 6).     
2320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2330: 20 20 20 20 20 20 20 20 20 20 20 20 28 61 72 72              (arr
2340: 61 79 2d 72 65 66 20 73 77 70 20 34 20 35 29 20  ay-ref swp 4 5) 
2350: 28 61 72 72 61 79 2d 72 65 66 20 73 77 70 20 34  (array-ref swp 4
2360: 20 36 29 29 29 29 0a 20 20 20 20 20 20 20 20 20   6)))).         
2370: 20 20 28 62 6f 78 2d 63 6f 6e 74 65 6e 74 73 20    (box-contents 
2380: 28 6c 61 6d 62 64 61 20 28 29 0a 20 20 20 20 20  (lambda ().     
2390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a0: 20 20 20 20 20 20 28 6c 69 73 74 20 28 61 72 72        (list (arr
23b0: 61 79 2d 72 65 66 20 62 6f 78 20 30 20 32 20 34  ay-ref box 0 2 4
23c0: 20 36 20 38 29 29 29 29 29 0a 20 20 20 20 20 20   6 8))))).      
23d0: 28 61 6e 64 20 28 65 71 75 61 6c 3f 20 28 6f 72  (and (equal? (or
23e0: 67 2d 63 6f 6e 74 65 6e 74 73 29 20 27 28 61 20  g-contents) '(a 
23f0: 62 20 63 20 64 20 65 20 66 29 29 0a 20 20 20 20  b c d e f)).    
2400: 20 20 20 20 20 20 20 28 65 71 75 61 6c 3f 20 28         (equal? (
2410: 62 72 6b 2d 63 6f 6e 74 65 6e 74 73 29 20 27 28  brk-contents) '(
2420: 61 20 62 20 65 20 66 29 29 0a 20 20 20 20 20 20  a b e f)).      
2430: 20 20 20 20 20 28 65 71 75 61 6c 3f 20 28 73 77       (equal? (sw
2440: 70 2d 63 6f 6e 74 65 6e 74 73 29 20 27 28 64 20  p-contents) '(d 
2450: 63 20 66 20 65 29 29 0a 20 20 20 20 20 20 20 20  c f e)).        
2460: 20 20 20 28 65 71 75 61 6c 3f 20 28 62 6f 78 2d     (equal? (box-
2470: 63 6f 6e 74 65 6e 74 73 29 20 27 28 65 29 29 0a  contents) '(e)).
2480: 20 20 20 20 20 20 20 20 20 20 20 28 62 65 67 69             (begi
2490: 6e 20 28 61 72 72 61 79 2d 73 65 74 21 20 6f 72  n (array-set! or
24a0: 67 20 36 20 30 20 27 78 29 20 23 74 29 0a 20 20  g 6 0 'x) #t).  
24b0: 20 20 20 20 20 20 20 20 20 28 65 71 75 61 6c 3f           (equal?
24c0: 20 28 6f 72 67 2d 63 6f 6e 74 65 6e 74 73 29 20   (org-contents) 
24d0: 27 28 78 20 62 20 63 20 64 20 65 20 66 29 29 0a  '(x b c d e f)).
24e0: 20 20 20 20 20 20 20 20 20 20 20 28 65 71 75 61             (equa
24f0: 6c 3f 20 28 62 72 6b 2d 63 6f 6e 74 65 6e 74 73  l? (brk-contents
2500: 29 20 27 28 78 20 62 20 65 20 66 29 29 0a 20 20  ) '(x b e f)).  
2510: 20 20 20 20 20 20 20 20 20 28 65 71 75 61 6c 3f           (equal?
2520: 20 28 73 77 70 2d 63 6f 6e 74 65 6e 74 73 29 20   (swp-contents) 
2530: 27 28 64 20 63 20 66 20 65 29 29 0a 20 20 20 20  '(d c f e)).    
2540: 20 20 20 20 20 20 20 28 65 71 75 61 6c 3f 20 28         (equal? (
2550: 62 6f 78 2d 63 6f 6e 74 65 6e 74 73 29 20 27 28  box-contents) '(
2560: 65 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 28  e)).           (
2570: 62 65 67 69 6e 20 28 61 72 72 61 79 2d 73 65 74  begin (array-set
2580: 21 20 62 72 6b 20 33 20 31 20 27 79 29 20 23 74  ! brk 3 1 'y) #t
2590: 29 0a 20 20 20 20 20 20 20 20 20 20 20 28 65 71  ).           (eq
25a0: 75 61 6c 3f 20 28 6f 72 67 2d 63 6f 6e 74 65 6e  ual? (org-conten
25b0: 74 73 29 20 27 28 78 20 62 20 63 20 64 20 79 20  ts) '(x b c d y 
25c0: 66 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 28  f)).           (
25d0: 65 71 75 61 6c 3f 20 28 62 72 6b 2d 63 6f 6e 74  equal? (brk-cont
25e0: 65 6e 74 73 29 20 27 28 78 20 62 20 79 20 66 29  ents) '(x b y f)
25f0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 28 65 71  ).           (eq
2600: 75 61 6c 3f 20 28 73 77 70 2d 63 6f 6e 74 65 6e  ual? (swp-conten
2610: 74 73 29 20 27 28 64 20 63 20 66 20 79 29 29 0a  ts) '(d c f y)).
2620: 20 20 20 20 20 20 20 20 20 20 20 28 65 71 75 61             (equa
2630: 6c 3f 20 28 62 6f 78 2d 63 6f 6e 74 65 6e 74 73  l? (box-contents
2640: 29 20 27 28 79 29 29 0a 20 20 20 20 20 20 20 20  ) '(y)).        
2650: 20 20 20 28 62 65 67 69 6e 20 28 61 72 72 61 79     (begin (array
2660: 2d 73 65 74 21 20 73 77 70 20 34 20 35 20 27 7a  -set! swp 4 5 'z
2670: 29 20 23 74 29 0a 20 20 20 20 20 20 20 20 20 20  ) #t).          
2680: 20 28 65 71 75 61 6c 3f 20 28 6f 72 67 2d 63 6f   (equal? (org-co
2690: 6e 74 65 6e 74 73 29 20 27 28 78 20 62 20 63 20  ntents) '(x b c 
26a0: 64 20 79 20 7a 29 29 0a 20 20 20 20 20 20 20 20  d y z)).        
26b0: 20 20 20 28 65 71 75 61 6c 3f 20 28 62 72 6b 2d     (equal? (brk-
26c0: 63 6f 6e 74 65 6e 74 73 29 20 27 28 78 20 62 20  contents) '(x b 
26d0: 79 20 7a 29 29 0a 20 20 20 20 20 20 20 20 20 20  y z)).          
26e0: 20 28 65 71 75 61 6c 3f 20 28 73 77 70 2d 63 6f   (equal? (swp-co
26f0: 6e 74 65 6e 74 73 29 20 27 28 64 20 63 20 7a 20  ntents) '(d c z 
2700: 79 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 28  y)).           (
2710: 65 71 75 61 6c 3f 20 28 62 6f 78 2d 63 6f 6e 74  equal? (box-cont
2720: 65 6e 74 73 29 20 27 28 79 29 29 0a 20 20 20 20  ents) '(y)).    
2730: 20 20 20 20 20 20 20 28 62 65 67 69 6e 20 28 61         (begin (a
2740: 72 72 61 79 2d 73 65 74 21 20 62 6f 78 20 30 20  rray-set! box 0 
2750: 32 20 34 20 36 20 38 20 27 65 29 20 23 74 29 0a  2 4 6 8 'e) #t).
2760: 20 20 20 20 20 20 20 20 20 20 20 28 65 71 75 61             (equa
2770: 6c 3f 20 28 6f 72 67 2d 63 6f 6e 74 65 6e 74 73  l? (org-contents
2780: 29 20 27 28 78 20 62 20 63 20 64 20 65 20 7a 29  ) '(x b c d e z)
2790: 29 0a 20 20 20 20 20 20 20 20 20 20 20 28 65 71  ).           (eq
27a0: 75 61 6c 3f 20 28 62 72 6b 2d 63 6f 6e 74 65 6e  ual? (brk-conten
27b0: 74 73 29 20 27 28 78 20 62 20 65 20 7a 29 29 0a  ts) '(x b e z)).
27c0: 20 20 20 20 20 20 20 20 20 20 20 28 65 71 75 61             (equa
27d0: 6c 3f 20 28 73 77 70 2d 63 6f 6e 74 65 6e 74 73  l? (swp-contents
27e0: 29 20 27 28 64 20 63 20 7a 20 65 29 29 0a 20 20  ) '(d c z e)).  
27f0: 20 20 20 20 20 20 20 20 20 28 65 71 75 61 6c 3f           (equal?
2800: 20 28 62 6f 78 2d 63 6f 6e 74 65 6e 74 73 29 20   (box-contents) 
2810: 27 28 65 29 29 29 29 0a 20 20 20 20 28 65 72 72  '(e)))).    (err
2820: 6f 72 20 22 73 68 61 72 65 64 20 63 68 61 6e 67  or "shared chang
2830: 65 20 66 61 69 6c 65 64 22 29 29 0a 0a 28 70 61  e failed"))..(pa
2840: 73 74 20 22 73 68 61 72 65 64 20 63 68 61 6e 67  st "shared chang
2850: 65 22 29 0a 0a 3b 3b 3b 20 43 68 65 63 6b 20 74  e")..;;; Check t
2860: 68 61 74 20 61 72 72 61 79 73 20 63 6f 70 79 20  hat arrays copy 
2870: 74 68 65 20 73 68 61 70 65 20 73 70 65 63 69 66  the shape specif
2880: 69 63 61 74 69 6f 6e 0a 0a 28 6f 72 20 28 6c 65  ication..(or (le
2890: 74 20 28 28 73 68 70 20 28 73 68 61 70 65 20 31  t ((shp (shape 1
28a0: 30 20 31 32 29 29 29 0a 20 20 20 20 20 20 28 6c  0 12))).      (l
28b0: 65 74 20 28 28 61 72 72 20 28 6d 61 6b 65 2d 61  et ((arr (make-a
28c0: 72 72 61 79 20 73 68 70 29 29 0a 20 20 20 20 20  rray shp)).     
28d0: 20 20 20 20 20 20 20 28 61 72 73 20 28 61 72 72         (ars (arr
28e0: 61 79 20 73 68 70 20 2a 20 2a 29 29 0a 20 20 20  ay shp * *)).   
28f0: 20 20 20 20 20 20 20 20 20 28 61 72 74 20 28 73           (art (s
2900: 68 61 72 65 2d 61 72 72 61 79 20 28 6d 61 6b 65  hare-array (make
2910: 2d 61 72 72 61 79 20 73 68 70 29 20 73 68 70 20  -array shp) shp 
2920: 28 6c 61 6d 62 64 61 20 28 6b 29 20 6b 29 29 29  (lambda (k) k)))
2930: 29 0a 20 20 20 20 20 20 20 20 28 61 72 72 61 79  ).        (array
2940: 2d 73 65 74 21 20 73 68 70 20 30 20 30 20 27 3f  -set! shp 0 0 '?
2950: 29 0a 20 20 20 20 20 20 20 20 28 61 72 72 61 79  ).        (array
2960: 2d 73 65 74 21 20 73 68 70 20 30 20 31 20 27 21  -set! shp 0 1 '!
2970: 29 0a 20 20 20 20 20 20 20 20 28 61 6e 64 20 28  ).        (and (
2980: 3d 20 28 61 72 72 61 79 2d 72 61 6e 6b 20 73 68  = (array-rank sh
2990: 70 29 20 32 29 0a 20 20 20 20 20 20 20 20 20 20  p) 2).          
29a0: 20 20 20 28 3d 20 28 61 72 72 61 79 2d 73 74 61     (= (array-sta
29b0: 72 74 20 73 68 70 20 30 29 20 30 29 0a 20 20 20  rt shp 0) 0).   
29c0: 20 20 20 20 20 20 20 20 20 20 28 3d 20 28 61 72            (= (ar
29d0: 72 61 79 2d 65 6e 64 20 73 68 70 20 30 29 20 31  ray-end shp 0) 1
29e0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ).             (
29f0: 3d 20 28 61 72 72 61 79 2d 73 74 61 72 74 20 73  = (array-start s
2a00: 68 70 20 31 29 20 30 29 0a 20 20 20 20 20 20 20  hp 1) 0).       
2a10: 20 20 20 20 20 20 28 3d 20 28 61 72 72 61 79 2d        (= (array-
2a20: 65 6e 64 20 73 68 70 20 31 29 20 32 29 0a 20 20  end shp 1) 2).  
2a30: 20 20 20 20 20 20 20 20 20 20 20 28 65 71 3f 20             (eq? 
2a40: 28 61 72 72 61 79 2d 72 65 66 20 73 68 70 20 30  (array-ref shp 0
2a50: 20 30 29 20 27 3f 29 0a 20 20 20 20 20 20 20 20   0) '?).        
2a60: 20 20 20 20 20 28 65 71 3f 20 28 61 72 72 61 79       (eq? (array
2a70: 2d 72 65 66 20 73 68 70 20 30 20 31 29 20 27 21  -ref shp 0 1) '!
2a80: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ).             (
2a90: 3d 20 28 61 72 72 61 79 2d 72 61 6e 6b 20 61 72  = (array-rank ar
2aa0: 72 29 20 31 29 0a 20 20 20 20 20 20 20 20 20 20  r) 1).          
2ab0: 20 20 20 28 3d 20 28 61 72 72 61 79 2d 73 74 61     (= (array-sta
2ac0: 72 74 20 61 72 72 20 30 29 20 31 30 29 0a 20 20  rt arr 0) 10).  
2ad0: 20 20 20 20 20 20 20 20 20 20 20 28 3d 20 28 61             (= (a
2ae0: 72 72 61 79 2d 65 6e 64 20 61 72 72 20 30 29 20  rray-end arr 0) 
2af0: 31 32 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  12).            
2b00: 20 28 3d 20 28 61 72 72 61 79 2d 72 61 6e 6b 20   (= (array-rank 
2b10: 61 72 73 29 20 31 29 0a 20 20 20 20 20 20 20 20  ars) 1).        
2b20: 20 20 20 20 20 28 3d 20 28 61 72 72 61 79 2d 73       (= (array-s
2b30: 74 61 72 74 20 61 72 73 20 30 29 20 31 30 29 0a  tart ars 0) 10).
2b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 3d 20               (= 
2b50: 28 61 72 72 61 79 2d 65 6e 64 20 61 72 73 20 30  (array-end ars 0
2b60: 29 20 31 32 29 0a 20 20 20 20 20 20 20 20 20 20  ) 12).          
2b70: 20 20 20 28 3d 20 28 61 72 72 61 79 2d 72 61 6e     (= (array-ran
2b80: 6b 20 61 72 74 29 20 31 29 0a 20 20 20 20 20 20  k art) 1).      
2b90: 20 20 20 20 20 20 20 28 3d 20 28 61 72 72 61 79         (= (array
2ba0: 2d 73 74 61 72 74 20 61 72 74 20 30 29 20 31 30  -start art 0) 10
2bb0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ).             (
2bc0: 3d 20 28 61 72 72 61 79 2d 65 6e 64 20 61 72 74  = (array-end art
2bd0: 20 30 29 20 31 32 29 29 29 29 0a 20 20 20 20 28   0) 12)))).    (
2be0: 65 72 72 6f 72 20 22 61 72 72 61 79 2d 73 65 74  error "array-set
2bf0: 21 20 6f 66 20 73 68 61 70 65 20 66 61 69 6c 65  ! of shape faile
2c00: 64 22 29 29 0a 0a 28 70 61 73 74 20 22 61 72 72  d"))..(past "arr
2c10: 61 79 2d 73 65 74 21 20 6f 66 20 73 68 61 70 65  ay-set! of shape
2c20: 22 29 0a 0a 3b 3b 3b 20 43 68 65 63 6b 20 74 68  ")..;;; Check th
2c30: 61 74 20 69 6e 64 65 78 20 61 72 72 61 79 73 20  at index arrays 
2c40: 77 6f 72 6b 20 65 76 65 6e 20 77 68 65 6e 20 74  work even when t
2c50: 68 65 79 20 73 68 61 72 65 0a 3b 3b 3b 0a 3b 3b  hey share.;;;.;;
2c60: 3b 20 61 72 72 20 20 20 20 20 20 20 69 78 6e 0a  ; arr       ixn.
2c70: 3b 3b 3b 20 20 20 35 20 20 36 20 20 20 20 20 20  ;;;   5  6      
2c80: 30 20 31 0a 3b 3b 3b 20 34 20 6e 77 20 6e 65 20  0 1.;;; 4 nw ne 
2c90: 20 20 30 20 34 20 36 0a 3b 3b 3b 20 35 20 73 77    0 4 6.;;; 5 sw
2ca0: 20 73 65 20 20 20 31 20 35 20 34 0a 0a 28 6f 72   se   1 5 4..(or
2cb0: 20 28 6c 65 74 20 28 28 61 72 72 20 28 61 72 72   (let ((arr (arr
2cc0: 61 79 20 28 73 68 61 70 65 20 34 20 36 20 35 20  ay (shape 4 6 5 
2cd0: 37 29 20 27 6e 77 20 27 6e 65 20 27 73 77 20 27  7) 'nw 'ne 'sw '
2ce0: 73 65 29 29 0a 20 20 20 20 20 20 20 20 20 20 28  se)).          (
2cf0: 69 78 6e 20 28 61 72 72 61 79 20 28 73 68 61 70  ixn (array (shap
2d00: 65 20 30 20 32 20 30 20 32 29 20 34 20 36 20 35  e 0 2 0 2) 4 6 5
2d10: 20 34 29 29 29 0a 20 20 20 20 20 20 28 6c 65 74   4))).      (let
2d20: 20 28 28 63 6f 6c 30 20 28 73 68 61 72 65 2d 61   ((col0 (share-a
2d30: 72 72 61 79 0a 20 20 20 20 20 20 20 20 20 20 20  rray.           
2d40: 20 20 20 20 20 20 20 20 69 78 6e 0a 20 20 20 20          ixn.    
2d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2d60: 73 68 61 70 65 20 30 20 32 29 0a 20 20 20 20 20  shape 0 2).     
2d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6c                (l
2d80: 61 6d 62 64 61 20 28 6b 29 0a 20 20 20 20 20 20  ambda (k).      
2d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2da0: 76 61 6c 75 65 73 20 6b 20 30 29 29 29 29 0a 20  values k 0)))). 
2db0: 20 20 20 20 20 20 20 20 20 20 20 28 72 6f 77 30             (row0
2dc0: 20 28 73 68 61 72 65 2d 61 72 72 61 79 0a 20 20   (share-array.  
2dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de0: 20 69 78 6e 0a 20 20 20 20 20 20 20 20 20 20 20   ixn.           
2df0: 20 20 20 20 20 20 20 20 28 73 68 61 70 65 20 30          (shape 0
2e00: 20 32 29 0a 20 20 20 20 20 20 20 20 20 20 20 20   2).            
2e10: 20 20 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28         (lambda (
2e20: 6b 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k).             
2e30: 20 20 20 20 20 20 20 20 28 76 61 6c 75 65 73 20          (values 
2e40: 30 20 6b 29 29 29 29 0a 20 20 20 20 20 20 20 20  0 k)))).        
2e50: 20 20 20 20 28 77 6f 72 31 20 28 73 68 61 72 65      (wor1 (share
2e60: 2d 61 72 72 61 79 0a 20 20 20 20 20 20 20 20 20  -array.         
2e70: 20 20 20 20 20 20 20 20 20 20 69 78 6e 0a 20 20            ixn.  
2e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e90: 20 28 73 68 61 70 65 20 30 20 32 29 0a 20 20 20   (shape 0 2).   
2ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eb0: 28 6c 61 6d 62 64 61 20 28 6b 29 0a 20 20 20 20  (lambda (k).    
2ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ed0: 20 28 76 61 6c 75 65 73 20 31 20 28 2d 20 31 20   (values 1 (- 1 
2ee0: 6b 29 29 29 29 29 0a 20 20 20 20 20 20 20 20 20  k))))).         
2ef0: 20 20 20 28 63 6f 64 20 28 73 68 61 72 65 2d 61     (cod (share-a
2f00: 72 72 61 79 0a 20 20 20 20 20 20 20 20 20 20 20  rray.           
2f10: 20 20 20 20 20 20 20 69 78 6e 0a 20 20 20 20 20         ixn.     
2f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 68               (sh
2f30: 61 70 65 20 30 20 32 29 0a 20 20 20 20 20 20 20  ape 0 2).       
2f40: 20 20 20 20 20 20 20 20 20 20 20 28 6c 61 6d 62             (lamb
2f50: 64 61 20 28 6b 29 0a 20 20 20 20 20 20 20 20 20  da (k).         
2f60: 20 20 20 20 20 20 20 20 20 20 20 28 63 61 73 65             (case
2f70: 20 6b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   k.             
2f80: 20 20 20 20 20 20 20 20 20 28 28 30 29 20 28 76           ((0) (v
2f90: 61 6c 75 65 73 20 31 20 30 29 29 0a 20 20 20 20  alues 1 0)).    
2fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb0: 20 20 28 28 31 29 20 28 76 61 6c 75 65 73 20 30    ((1) (values 0
2fc0: 20 31 29 29 29 29 29 29 0a 20 20 20 20 20 20 20   1)))))).       
2fd0: 20 20 20 20 20 28 62 6f 78 20 28 73 68 61 72 65       (box (share
2fe0: 2d 61 72 72 61 79 0a 20 20 20 20 20 20 20 20 20  -array.         
2ff0: 20 20 20 20 20 20 20 20 20 69 78 6e 0a 20 20 20           ixn.   
3000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
3010: 73 68 61 70 65 20 30 20 32 29 0a 20 20 20 20 20  shape 0 2).     
3020: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6c 61               (la
3030: 6d 62 64 61 20 28 6b 29 0a 20 20 20 20 20 20 20  mbda (k).       
3040: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 61               (va
3050: 6c 75 65 73 20 31 20 30 29 29 29 29 29 0a 20 20  lues 1 0))))).  
3060: 20 20 20 20 20 20 28 61 6e 64 20 28 65 71 3f 20        (and (eq? 
3070: 28 61 72 72 61 79 2d 72 65 66 20 61 72 72 20 63  (array-ref arr c
3080: 6f 6c 30 29 20 27 6e 77 29 0a 20 20 20 20 20 20  ol0) 'nw).      
3090: 20 20 20 20 20 20 20 28 65 71 3f 20 28 61 72 72         (eq? (arr
30a0: 61 79 2d 72 65 66 20 61 72 72 20 72 6f 77 30 29  ay-ref arr row0)
30b0: 20 27 6e 65 29 0a 20 20 20 20 20 20 20 20 20 20   'ne).          
30c0: 20 20 20 28 65 71 3f 20 28 61 72 72 61 79 2d 72     (eq? (array-r
30d0: 65 66 20 61 72 72 20 77 6f 72 31 29 20 27 6e 77  ef arr wor1) 'nw
30e0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ).             (
30f0: 65 71 3f 20 28 61 72 72 61 79 2d 72 65 66 20 61  eq? (array-ref a
3100: 72 72 20 63 6f 64 29 20 27 73 65 29 0a 20 20 20  rr cod) 'se).   
3110: 20 20 20 20 20 20 20 20 20 20 28 65 71 3f 20 28            (eq? (
3120: 61 72 72 61 79 2d 72 65 66 20 61 72 72 20 62 6f  array-ref arr bo
3130: 78 29 20 27 73 77 29 0a 20 20 20 20 20 20 20 20  x) 'sw).        
3140: 20 20 20 20 20 28 62 65 67 69 6e 0a 20 20 20 20       (begin.    
3150: 20 20 20 20 20 20 20 20 20 20 20 28 61 72 72 61             (arra
3160: 79 2d 73 65 74 21 20 61 72 72 20 63 6f 6c 30 20  y-set! arr col0 
3170: 27 75 6c 29 0a 20 20 20 20 20 20 20 20 20 20 20  'ul).           
3180: 20 20 20 20 28 61 72 72 61 79 2d 73 65 74 21 20      (array-set! 
3190: 61 72 72 20 72 6f 77 30 20 27 75 72 29 0a 20 20  arr row0 'ur).  
31a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 61 72               (ar
31b0: 72 61 79 2d 73 65 74 21 20 61 72 72 20 63 6f 64  ray-set! arr cod
31c0: 20 27 6c 72 29 0a 20 20 20 20 20 20 20 20 20 20   'lr).          
31d0: 20 20 20 20 20 28 61 72 72 61 79 2d 73 65 74 21       (array-set!
31e0: 20 61 72 72 20 62 6f 78 20 27 6c 6c 29 0a 20 20   arr box 'll).  
31f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 74 29               #t)
3200: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28 65  .             (e
3210: 71 3f 20 28 61 72 72 61 79 2d 72 65 66 20 61 72  q? (array-ref ar
3220: 72 20 34 20 35 29 20 27 75 6c 29 0a 20 20 20 20  r 4 5) 'ul).    
3230: 20 20 20 20 20 20 20 20 20 28 65 71 3f 20 28 61           (eq? (a
3240: 72 72 61 79 2d 72 65 66 20 61 72 72 20 34 20 36  rray-ref arr 4 6
3250: 29 20 27 75 72 29 0a 20 20 20 20 20 20 20 20 20  ) 'ur).         
3260: 20 20 20 20 28 65 71 3f 20 28 61 72 72 61 79 2d      (eq? (array-
3270: 72 65 66 20 61 72 72 20 35 20 35 29 20 27 6c 6c  ref arr 5 5) 'll
3280: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ).             (
3290: 65 71 3f 20 28 61 72 72 61 79 2d 72 65 66 20 61  eq? (array-ref a
32a0: 72 72 20 35 20 36 29 20 27 6c 72 29 0a 20 20 20  rr 5 6) 'lr).   
32b0: 20 20 20 20 20 20 20 20 20 20 28 62 65 67 69 6e            (begin
32c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
32d0: 28 61 72 72 61 79 2d 73 65 74 21 20 61 72 72 20  (array-set! arr 
32e0: 77 6f 72 31 20 27 78 78 29 0a 20 20 20 20 20 20  wor1 'xx).      
32f0: 20 20 20 20 20 20 20 20 20 28 65 71 3f 20 28 61           (eq? (a
3300: 72 72 61 79 2d 72 65 66 20 61 72 72 20 34 20 35  rray-ref arr 4 5
3310: 29 20 27 78 78 29 29 29 29 29 0a 20 20 20 20 28  ) 'xx))))).    (
3320: 65 72 72 6f 72 20 22 61 72 72 61 79 20 61 63 63  error "array acc
3330: 65 73 73 20 77 69 74 68 20 73 68 61 72 69 6e 67  ess with sharing
3340: 20 69 6e 64 65 78 20 61 72 72 61 79 20 66 61 69   index array fai
3350: 6c 65 64 22 29 29 0a 0a 28 70 61 73 74 20 22 61  led"))..(past "a
3360: 72 72 61 79 20 61 63 63 65 73 73 20 77 69 74 68  rray access with
3370: 20 73 68 61 72 69 6e 67 20 69 6e 64 65 78 20 61   sharing index a
3380: 72 72 61 79 22 29 0a 0a 3b 3b 3b 20 43 68 65 63  rray")..;;; Chec
3390: 6b 20 74 68 61 74 20 73 68 61 70 65 20 61 72 72  k that shape arr
33a0: 61 79 73 20 77 6f 72 6b 20 65 76 65 6e 20 77 68  ays work even wh
33b0: 65 6e 20 74 68 65 79 20 73 68 61 72 65 0a 3b 3b  en they share.;;
33c0: 3b 0a 3b 3b 3b 20 61 72 72 20 20 20 20 20 20 20  ;.;;; arr       
33d0: 20 20 20 20 20 20 73 68 70 20 20 20 20 20 20 20        shp       
33e0: 73 68 71 20 20 20 20 20 20 20 73 68 72 20 20 20  shq       shr   
33f0: 20 20 20 20 73 68 73 0a 3b 3b 3b 20 20 20 20 31      shs.;;;    1
3400: 20 20 32 20 20 33 20 20 34 20 20 20 20 20 20 30    2  3  4      0
3410: 20 20 31 20 20 20 20 20 20 30 20 20 31 20 20 20    1      0  1   
3420: 20 20 20 30 20 20 31 20 20 20 20 20 20 30 20 20     0  1      0  
3430: 31 20 0a 3b 3b 3b 20 31 20 31 30 20 31 32 20 31  1 .;;; 1 10 12 1
3440: 36 20 32 30 20 20 20 30 20 31 30 20 31 32 20 20  6 20   0 10 12  
3450: 20 30 20 31 32 20 32 30 20 20 20 30 20 31 30 20   0 12 20   0 10 
3460: 31 30 20 20 20 30 20 31 32 20 31 32 0a 3b 3b 3b  10   0 12 12.;;;
3470: 20 32 20 31 30 20 31 31 20 31 32 20 31 33 20 20   2 10 11 12 13  
3480: 20 31 20 31 30 20 31 31 20 20 20 31 20 31 31 20   1 10 11   1 11 
3490: 31 33 20 20 20 31 20 31 31 20 31 32 20 20 20 31  13   1 11 12   1
34a0: 20 31 32 20 31 32 0a 3b 3b 3b 20 20 20 20 20 20   12 12.;;;      
34b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32                 2
34d0: 20 31 32 20 31 36 0a 3b 3b 3b 20 20 20 20 20 20   12 16.;;;      
34e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 33                 3
3500: 20 31 33 20 32 30 0a 0a 28 6f 72 20 28 6c 65 74   13 20..(or (let
3510: 20 28 28 61 72 72 20 28 61 72 72 61 79 20 28 73   ((arr (array (s
3520: 68 61 70 65 20 31 20 33 20 31 20 35 29 20 31 30  hape 1 3 1 5) 10
3530: 20 31 32 20 31 36 20 32 30 20 31 30 20 31 31 20   12 16 20 10 11 
3540: 31 32 20 31 33 29 29 29 0a 20 20 20 20 20 20 28  12 13))).      (
3550: 6c 65 74 20 28 28 73 68 70 20 28 73 68 61 72 65  let ((shp (share
3560: 2d 61 72 72 61 79 0a 20 20 20 20 20 20 20 20 20  -array.         
3570: 20 20 20 20 20 20 20 20 20 61 72 72 0a 20 20 20           arr.   
3580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
3590: 73 68 61 70 65 20 30 20 32 20 30 20 32 29 0a 20  shape 0 2 0 2). 
35a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35b0: 20 28 6c 61 6d 62 64 61 20 28 72 20 6b 29 0a 20   (lambda (r k). 
35c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35d0: 20 20 20 28 76 61 6c 75 65 73 20 28 2b 20 72 20     (values (+ r 
35e0: 31 29 20 28 2b 20 6b 20 31 29 29 29 29 29 0a 20  1) (+ k 1))))). 
35f0: 20 20 20 20 20 20 20 20 20 20 20 28 73 68 71 20             (shq 
3600: 28 73 68 61 72 65 2d 61 72 72 61 79 0a 20 20 20  (share-array.   
3610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
3620: 72 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  rr.             
3630: 20 20 20 20 20 28 73 68 61 70 65 20 30 20 32 20       (shape 0 2 
3640: 30 20 32 29 0a 20 20 20 20 20 20 20 20 20 20 20  0 2).           
3650: 20 20 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28         (lambda (
3660: 72 20 6b 29 0a 20 20 20 20 20 20 20 20 20 20 20  r k).           
3670: 20 20 20 20 20 20 20 20 20 28 76 61 6c 75 65 73           (values
3680: 20 28 2b 20 72 20 31 29 20 28 2a 20 32 20 28 2b   (+ r 1) (* 2 (+
3690: 20 31 20 6b 29 29 29 29 29 29 0a 20 20 20 20 20   1 k)))))).     
36a0: 20 20 20 20 20 20 20 28 73 68 72 20 28 73 68 61         (shr (sha
36b0: 72 65 2d 61 72 72 61 79 0a 20 20 20 20 20 20 20  re-array.       
36c0: 20 20 20 20 20 20 20 20 20 20 20 61 72 72 0a 20             arr. 
36d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36e0: 20 28 73 68 61 70 65 20 30 20 34 20 30 20 32 29   (shape 0 4 0 2)
36f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3700: 20 20 20 28 6c 61 6d 62 64 61 20 28 72 20 6b 29     (lambda (r k)
3710: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3720: 20 20 20 20 20 28 76 61 6c 75 65 73 20 28 2d 20       (values (- 
3730: 32 20 6b 29 20 28 2b 20 72 20 31 29 29 29 29 29  2 k) (+ r 1)))))
3740: 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 73 68  .            (sh
3750: 73 20 28 73 68 61 72 65 2d 61 72 72 61 79 0a 20  s (share-array. 
3760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3770: 20 61 72 72 0a 20 20 20 20 20 20 20 20 20 20 20   arr.           
3780: 20 20 20 20 20 20 20 28 73 68 61 70 65 20 30 20         (shape 0 
3790: 32 20 30 20 32 29 0a 20 20 20 20 20 20 20 20 20  2 0 2).         
37a0: 20 20 20 20 20 20 20 20 20 28 6c 61 6d 62 64 61           (lambda
37b0: 20 28 72 20 6b 29 0a 20 20 20 20 20 20 20 20 20   (r k).         
37c0: 20 20 20 20 20 20 20 20 20 20 20 28 76 61 6c 75             (valu
37d0: 65 73 20 32 20 33 29 29 29 29 29 0a 20 20 20 20  es 2 3))))).    
37e0: 20 20 20 20 28 61 6e 64 20 28 6c 65 74 20 28 28      (and (let ((
37f0: 61 72 72 2d 70 20 28 6d 61 6b 65 2d 61 72 72 61  arr-p (make-arra
3800: 79 20 73 68 70 29 29 29 0a 20 20 20 20 20 20 20  y shp))).       
3810: 20 20 20 20 20 20 20 20 28 61 6e 64 20 28 3d 20          (and (= 
3820: 28 61 72 72 61 79 2d 72 61 6e 6b 20 61 72 72 2d  (array-rank arr-
3830: 70 29 20 32 29 0a 20 20 20 20 20 20 20 20 20 20  p) 2).          
3840: 20 20 20 20 20 20 20 20 20 20 28 3d 20 28 61 72            (= (ar
3850: 72 61 79 2d 73 74 61 72 74 20 61 72 72 2d 70 20  ray-start arr-p 
3860: 30 29 20 31 30 29 0a 20 20 20 20 20 20 20 20 20  0) 10).         
3870: 20 20 20 20 20 20 20 20 20 20 20 28 3d 20 28 61             (= (a
3880: 72 72 61 79 2d 65 6e 64 20 61 72 72 2d 70 20 30  rray-end arr-p 0
3890: 29 20 31 32 29 0a 20 20 20 20 20 20 20 20 20 20  ) 12).          
38a0: 20 20 20 20 20 20 20 20 20 20 28 3d 20 28 61 72            (= (ar
38b0: 72 61 79 2d 73 74 61 72 74 20 61 72 72 2d 70 20  ray-start arr-p 
38c0: 31 29 20 31 30 29 0a 20 20 20 20 20 20 20 20 20  1) 10).         
38d0: 20 20 20 20 20 20 20 20 20 20 20 28 3d 20 28 61             (= (a
38e0: 72 72 61 79 2d 65 6e 64 20 61 72 72 2d 70 20 31  rray-end arr-p 1
38f0: 29 20 31 31 29 29 29 0a 20 20 20 20 20 20 20 20  ) 11))).        
3900: 20 20 20 20 20 28 6c 65 74 20 28 28 61 72 72 2d       (let ((arr-
3910: 71 20 28 61 72 72 61 79 20 73 68 71 20 2a 20 2a  q (array shq * *
3920: 20 2a 20 2a 20 20 2a 20 2a 20 2a 20 2a 20 20 2a   * *  * * * *  *
3930: 20 2a 20 2a 20 2a 20 20 2a 20 2a 20 2a 20 2a 29   * * *  * * * *)
3940: 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )).             
3950: 20 20 28 61 6e 64 20 28 3d 20 28 61 72 72 61 79    (and (= (array
3960: 2d 72 61 6e 6b 20 61 72 72 2d 71 29 20 32 29 0a  -rank arr-q) 2).
3970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3980: 20 20 20 20 28 3d 20 28 61 72 72 61 79 2d 73 74      (= (array-st
3990: 61 72 74 20 61 72 72 2d 71 20 30 29 20 31 32 29  art arr-q 0) 12)
39a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
39b0: 20 20 20 20 20 28 3d 20 28 61 72 72 61 79 2d 65       (= (array-e
39c0: 6e 64 20 61 72 72 2d 71 20 30 29 20 32 30 29 0a  nd arr-q 0) 20).
39d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
39e0: 20 20 20 20 28 3d 20 28 61 72 72 61 79 2d 73 74      (= (array-st
39f0: 61 72 74 20 61 72 72 2d 71 20 31 29 20 31 31 29  art arr-q 1) 11)
3a00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3a10: 20 20 20 20 20 28 3d 20 28 61 72 72 61 79 2d 65       (= (array-e
3a20: 6e 64 20 61 72 72 2d 71 20 31 29 20 31 33 29 29  nd arr-q 1) 13))
3a30: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ).             (
3a40: 6c 65 74 20 28 28 61 72 72 2d 72 20 28 73 68 61  let ((arr-r (sha
3a50: 72 65 2d 61 72 72 61 79 0a 20 20 20 20 20 20 20  re-array.       
3a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a70: 20 20 20 20 28 61 72 72 61 79 20 28 73 68 61 70      (array (shap
3a80: 65 29 20 2a 29 0a 20 20 20 20 20 20 20 20 20 20  e) *).          
3a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3aa0: 20 73 68 72 0a 20 20 20 20 20 20 20 20 20 20 20   shr.           
3ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ac0: 28 6c 61 6d 62 64 61 20 5f 20 28 76 61 6c 75 65  (lambda _ (value
3ad0: 73 29 29 29 29 29 0a 20 20 20 20 20 20 20 20 20  s))))).         
3ae0: 20 20 20 20 20 20 28 61 6e 64 20 28 3d 20 28 61        (and (= (a
3af0: 72 72 61 79 2d 72 61 6e 6b 20 61 72 72 2d 72 29  rray-rank arr-r)
3b00: 20 34 29 0a 20 20 20 20 20 20 20 20 20 20 20 20   4).            
3b10: 20 20 20 20 20 20 20 20 28 3d 20 28 61 72 72 61          (= (arra
3b20: 79 2d 73 74 61 72 74 20 61 72 72 2d 72 20 30 29  y-start arr-r 0)
3b30: 20 31 30 29 0a 20 20 20 20 20 20 20 20 20 20 20   10).           
3b40: 20 20 20 20 20 20 20 20 20 28 3d 20 28 61 72 72           (= (arr
3b50: 61 79 2d 65 6e 64 20 61 72 72 2d 72 20 30 29 20  ay-end arr-r 0) 
3b60: 31 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  10).            
3b70: 20 20 20 20 20 20 20 20 28 3d 20 28 61 72 72 61          (= (arra
3b80: 79 2d 73 74 61 72 74 20 61 72 72 2d 72 20 31 29  y-start arr-r 1)
3b90: 20 31 31 29 0a 20 20 20 20 20 20 20 20 20 20 20   11).           
3ba0: 20 20 20 20 20 20 20 20 20 28 3d 20 28 61 72 72           (= (arr
3bb0: 61 79 2d 65 6e 64 20 61 72 72 2d 72 20 31 29 20  ay-end arr-r 1) 
3bc0: 31 32 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  12).            
3bd0: 20 20 20 20 20 20 20 20 28 3d 20 28 61 72 72 61          (= (arra
3be0: 79 2d 73 74 61 72 74 20 61 72 72 2d 72 20 32 29  y-start arr-r 2)
3bf0: 20 31 32 29 0a 20 20 20 20 20 20 20 20 20 20 20   12).           
3c00: 20 20 20 20 20 20 20 20 20 28 3d 20 28 61 72 72           (= (arr
3c10: 61 79 2d 65 6e 64 20 61 72 72 2d 72 20 32 29 20  ay-end arr-r 2) 
3c20: 31 36 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  16).            
3c30: 20 20 20 20 20 20 20 20 28 3d 20 28 61 72 72 61          (= (arra
3c40: 79 2d 73 74 61 72 74 20 61 72 72 2d 72 20 33 29  y-start arr-r 3)
3c50: 20 31 33 29 0a 20 20 20 20 20 20 20 20 20 20 20   13).           
3c60: 20 20 20 20 20 20 20 20 20 28 3d 20 28 61 72 72           (= (arr
3c70: 61 79 2d 65 6e 64 20 61 72 72 2d 72 20 33 29 20  ay-end arr-r 3) 
3c80: 32 30 29 29 29 0a 20 20 20 20 20 20 20 20 20 20  20))).          
3c90: 20 20 20 28 6c 65 74 20 28 28 61 72 72 2d 73 20     (let ((arr-s 
3ca0: 28 6d 61 6b 65 2d 61 72 72 61 79 20 73 68 73 29  (make-array shs)
3cb0: 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )).             
3cc0: 20 20 28 61 6e 64 20 28 3d 20 28 61 72 72 61 79    (and (= (array
3cd0: 2d 72 61 6e 6b 20 61 72 72 2d 73 29 20 32 29 0a  -rank arr-s) 2).
3ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3cf0: 20 20 20 20 28 3d 20 28 61 72 72 61 79 2d 73 74      (= (array-st
3d00: 61 72 74 20 61 72 72 2d 73 20 30 29 20 31 32 29  art arr-s 0) 12)
3d10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3d20: 20 20 20 20 20 28 3d 20 28 61 72 72 61 79 2d 65       (= (array-e
3d30: 6e 64 20 61 72 72 2d 73 20 30 29 20 31 32 29 0a  nd arr-s 0) 12).
3d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d50: 20 20 20 20 28 3d 20 28 61 72 72 61 79 2d 73 74      (= (array-st
3d60: 61 72 74 20 61 72 72 2d 73 20 31 29 20 31 32 29  art arr-s 1) 12)
3d70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3d80: 20 20 20 20 20 28 3d 20 28 61 72 72 61 79 2d 65       (= (array-e
3d90: 6e 64 20 61 72 72 2d 73 20 31 29 20 31 32 29 29  nd arr-s 1) 12))
3da0: 29 29 29 29 0a 20 20 20 20 28 65 72 72 6f 72 20  )))).    (error 
3db0: 22 73 68 61 72 69 6e 67 20 73 68 61 70 65 20 61  "sharing shape a
3dc0: 72 72 61 79 20 66 61 69 6c 65 64 22 29 29 0a 0a  rray failed"))..
3dd0: 28 70 61 73 74 20 22 73 68 61 72 69 6e 67 20 73  (past "sharing s
3de0: 68 61 70 65 20 61 72 72 61 79 22 29 0a 0a 28 6c  hape array")..(l
3df0: 65 74 20 28 28 73 75 70 65 72 20 28 61 72 72 61  et ((super (arra
3e00: 79 20 28 73 68 61 70 65 20 34 20 37 20 34 20 37  y (shape 4 7 4 7
3e10: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
3e20: 20 20 20 20 20 20 31 20 2a 20 2a 0a 20 20 20 20        1 * *.    
3e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e40: 2a 20 32 20 2a 0a 20 20 20 20 20 20 20 20 20 20  * 2 *.          
3e50: 20 20 20 20 20 20 20 20 20 20 2a 20 2a 20 33 29            * * 3)
3e60: 29 0a 20 20 20 20 20 20 28 73 75 62 73 68 61 70  ).      (subshap
3e70: 65 20 28 73 68 61 72 65 2d 61 72 72 61 79 0a 20  e (share-array. 
3e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e90: 28 61 72 72 61 79 20 28 73 68 61 70 65 20 30 20  (array (shape 0 
3ea0: 32 20 30 20 33 29 0a 20 20 20 20 20 20 20 20 20  2 0 3).         
3eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
3ec0: 20 34 20 2a 0a 20 20 20 20 20 20 20 20 20 20 20   4 *.           
3ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 20 37               * 7
3ee0: 20 2a 29 0a 20 20 20 20 20 20 20 20 20 20 20 20   *).            
3ef0: 20 20 20 20 20 28 73 68 61 70 65 20 30 20 31 20       (shape 0 1 
3f00: 30 20 32 29 0a 20 20 20 20 20 20 20 20 20 20 20  0 2).           
3f10: 20 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 72        (lambda (r
3f20: 20 6b 29 0a 20 20 20 20 20 20 20 20 20 20 20 20   k).            
3f30: 20 20 20 20 20 20 20 28 76 61 6c 75 65 73 20 6b         (values k
3f40: 20 31 29 29 29 29 29 0a 20 20 28 6c 65 74 20 28   1))))).  (let (
3f50: 28 73 75 62 20 28 73 68 61 72 65 2d 61 72 72 61  (sub (share-arra
3f60: 79 20 73 75 70 65 72 20 73 75 62 73 68 61 70 65  y super subshape
3f70: 20 28 6c 61 6d 62 64 61 20 28 6b 29 20 28 76 61   (lambda (k) (va
3f80: 6c 75 65 73 20 6b 20 6b 29 29 29 29 29 0a 20 20  lues k k))))).  
3f90: 20 20 3b 28 61 72 72 61 79 2d 65 71 75 61 6c 3f    ;(array-equal?
3fa0: 20 73 75 62 73 68 61 70 65 20 28 73 68 61 70 65   subshape (shape
3fb0: 20 34 20 37 29 29 0a 20 20 20 20 28 6f 72 20 28   4 7)).    (or (
3fc0: 61 6e 64 20 28 3d 20 28 61 72 72 61 79 2d 72 61  and (= (array-ra
3fd0: 6e 6b 20 73 75 62 73 68 61 70 65 29 20 32 29 0a  nk subshape) 2).
3fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 3d 20               (= 
3ff0: 28 61 72 72 61 79 2d 73 74 61 72 74 20 73 75 62  (array-start sub
4000: 73 68 61 70 65 20 30 29 20 30 29 0a 20 20 20 20  shape 0) 0).    
4010: 20 20 20 20 20 20 20 20 20 28 3d 20 28 61 72 72           (= (arr
4020: 61 79 2d 65 6e 64 20 73 75 62 73 68 61 70 65 20  ay-end subshape 
4030: 30 29 20 31 29 0a 20 20 20 20 20 20 20 20 20 20  0) 1).          
4040: 20 20 20 28 3d 20 28 61 72 72 61 79 2d 73 74 61     (= (array-sta
4050: 72 74 20 73 75 62 73 68 61 70 65 20 31 29 20 30  rt subshape 1) 0
4060: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ).             (
4070: 3d 20 28 61 72 72 61 79 2d 65 6e 64 20 73 75 62  = (array-end sub
4080: 73 68 61 70 65 20 31 29 20 32 29 0a 20 20 20 20  shape 1) 2).    
4090: 20 20 20 20 20 20 20 20 20 28 3d 20 28 61 72 72           (= (arr
40a0: 61 79 2d 72 65 66 20 73 75 62 73 68 61 70 65 20  ay-ref subshape 
40b0: 30 20 30 29 20 34 29 0a 20 20 20 20 20 20 20 20  0 0) 4).        
40c0: 20 20 20 20 20 28 3d 20 28 61 72 72 61 79 2d 72       (= (array-r
40d0: 65 66 20 73 75 62 73 68 61 70 65 20 30 20 31 29  ef subshape 0 1)
40e0: 20 37 29 29 0a 20 20 20 20 20 20 20 20 28 65 72   7)).        (er
40f0: 72 6f 72 20 22 73 68 61 72 69 6e 67 20 73 75 62  ror "sharing sub
4100: 73 68 61 70 65 20 66 61 69 6c 65 64 22 29 29 0a  shape failed")).
4110: 20 20 20 20 3b 28 61 72 72 61 79 2d 65 71 75 61      ;(array-equa
4120: 6c 3f 20 73 75 62 20 28 61 72 72 61 79 20 28 73  l? sub (array (s
4130: 68 61 70 65 20 34 20 37 29 20 31 20 32 20 33 29  hape 4 7) 1 2 3)
4140: 29 0a 20 20 20 20 28 6f 72 20 28 61 6e 64 20 28  ).    (or (and (
4150: 3d 20 28 61 72 72 61 79 2d 72 61 6e 6b 20 73 75  = (array-rank su
4160: 62 29 20 31 29 0a 20 20 20 20 20 20 20 20 20 20  b) 1).          
4170: 20 20 20 28 3d 20 28 61 72 72 61 79 2d 73 74 61     (= (array-sta
4180: 72 74 20 73 75 62 20 30 29 20 34 29 0a 20 20 20  rt sub 0) 4).   
4190: 20 20 20 20 20 20 20 20 20 20 28 3d 20 28 61 72            (= (ar
41a0: 72 61 79 2d 65 6e 64 20 73 75 62 20 30 29 20 37  ray-end sub 0) 7
41b0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ).             (
41c0: 3d 20 28 61 72 72 61 79 2d 72 65 66 20 73 75 62  = (array-ref sub
41d0: 20 34 29 20 31 29 0a 20 20 20 20 20 20 20 20 20   4) 1).         
41e0: 20 20 20 20 28 3d 20 28 61 72 72 61 79 2d 72 65      (= (array-re
41f0: 66 20 73 75 62 20 35 29 20 32 29 0a 20 20 20 20  f sub 5) 2).    
4200: 20 20 20 20 20 20 20 20 20 28 3d 20 28 61 72 72           (= (arr
4210: 61 79 2d 72 65 66 20 73 75 62 20 36 29 20 33 29  ay-ref sub 6) 3)
4220: 29 0a 20 20 20 20 20 20 20 20 28 65 72 72 6f 72  ).        (error
4230: 20 22 73 68 61 72 69 6e 67 20 77 69 74 68 20 73   "sharing with s
4240: 68 61 72 69 6e 67 20 73 75 62 73 68 61 70 65 20  haring subshape 
4250: 66 61 69 6c 65 64 22 29 29 29 29 0a 0a 28 70 61  failed"))))..(pa
4260: 73 74 20 22 73 68 61 72 69 6e 67 20 77 69 74 68  st "sharing with
4270: 20 73 68 61 72 69 6e 67 20 73 75 62 73 68 61 70   sharing subshap
4280: 65 22 29 0a                                      e").