Hex Artifact Content
Not logged in

Artifact eeadc083abb386ddbee8c6b8976dc93feddf8740:


0000: 28 64 65 66 69 6e 65 20 28 61 72 72 61 79 2d 72  (define (array-r
0010: 65 66 20 61 20 2e 20 78 73 29 0a 20 20 28 6f 72  ef a . xs).  (or
0020: 20 28 61 72 72 61 79 3a 61 72 72 61 79 3f 20 61   (array:array? a
0030: 29 0a 20 20 20 20 20 20 28 65 72 72 6f 72 20 22  ).      (error "
0040: 6e 6f 74 20 61 6e 20 61 72 72 61 79 22 29 29 0a  not an array")).
0050: 20 20 28 6c 65 74 20 28 28 73 68 61 70 65 20 28    (let ((shape (
0060: 61 72 72 61 79 3a 73 68 61 70 65 20 61 29 29 29  array:shape a)))
0070: 0a 20 20 20 20 28 69 66 20 28 6e 75 6c 6c 3f 20  .    (if (null? 
0080: 78 73 29 0a 20 20 20 20 20 20 20 20 28 61 72 72  xs).        (arr
0090: 61 79 3a 63 68 65 63 6b 2d 69 6e 64 69 63 65 73  ay:check-indices
00a0: 20 22 61 72 72 61 79 2d 72 65 66 22 20 78 73 20   "array-ref" xs 
00b0: 73 68 61 70 65 29 0a 20 20 20 20 20 20 20 20 28  shape).        (
00c0: 6c 65 74 20 28 28 78 20 28 63 61 72 20 78 73 29  let ((x (car xs)
00d0: 29 29 0a 20 20 20 20 20 20 20 20 20 20 28 69 66  )).          (if
00e0: 20 28 76 65 63 74 6f 72 3f 20 78 29 0a 20 20 20   (vector? x).   
00f0: 20 20 20 20 20 20 20 20 20 20 20 28 61 72 72 61             (arra
0100: 79 3a 63 68 65 63 6b 2d 69 6e 64 65 78 2d 76 65  y:check-index-ve
0110: 63 74 6f 72 20 22 61 72 72 61 79 2d 72 65 66 22  ctor "array-ref"
0120: 20 78 20 73 68 61 70 65 29 0a 20 20 20 20 20 20   x shape).      
0130: 20 20 20 20 20 20 20 20 28 69 66 20 28 69 6e 74          (if (int
0140: 65 67 65 72 3f 20 78 29 0a 20 20 20 20 20 20 20  eger? x).       
0150: 20 20 20 20 20 20 20 20 20 20 20 28 61 72 72 61             (arra
0160: 79 3a 63 68 65 63 6b 2d 69 6e 64 69 63 65 73 20  y:check-indices 
0170: 22 61 72 72 61 79 2d 72 65 66 22 20 78 73 20 73  "array-ref" xs s
0180: 68 61 70 65 29 0a 20 20 20 20 20 20 20 20 20 20  hape).          
0190: 20 20 20 20 20 20 20 20 28 69 66 20 28 61 72 72          (if (arr
01a0: 61 79 3a 61 72 72 61 79 3f 20 78 29 0a 20 20 20  ay:array? x).   
01b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
01c0: 20 20 20 28 61 72 72 61 79 3a 63 68 65 63 6b 2d     (array:check-
01d0: 69 6e 64 65 78 2d 61 63 74 6f 72 20 22 61 72 72  index-actor "arr
01e0: 61 79 2d 72 65 66 22 20 78 20 73 68 61 70 65 29  ay-ref" x shape)
01f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0200: 20 20 20 20 20 20 20 28 65 72 72 6f 72 20 22 6e         (error "n
0210: 6f 74 20 61 6e 20 69 6e 64 65 78 20 6f 62 6a 65  ot an index obje
0220: 63 74 22 29 29 29 29 29 29 0a 20 20 20 20 28 76  ct")))))).    (v
0230: 65 63 74 6f 72 2d 72 65 66 0a 20 20 20 20 20 28  ector-ref.     (
0240: 61 72 72 61 79 3a 76 65 63 74 6f 72 20 61 29 0a  array:vector a).
0250: 20 20 20 20 20 28 69 66 20 28 6e 75 6c 6c 3f 20       (if (null? 
0260: 78 73 29 0a 20 20 20 20 20 20 20 20 20 28 76 65  xs).         (ve
0270: 63 74 6f 72 2d 72 65 66 20 28 61 72 72 61 79 3a  ctor-ref (array:
0280: 69 6e 64 65 78 20 61 29 20 30 29 0a 20 20 20 20  index a) 0).    
0290: 20 20 20 20 20 28 6c 65 74 20 28 28 78 20 28 63       (let ((x (c
02a0: 61 72 20 78 73 29 29 29 0a 20 20 20 20 20 20 20  ar xs))).       
02b0: 20 20 20 20 28 69 66 20 28 76 65 63 74 6f 72 3f      (if (vector?
02c0: 20 78 29 0a 20 20 20 20 20 20 20 20 20 20 20 20   x).            
02d0: 20 20 20 28 61 72 72 61 79 3a 69 6e 64 65 78 2f     (array:index/
02e0: 76 65 63 74 6f 72 0a 20 20 20 20 20 20 20 20 20  vector.         
02f0: 20 20 20 20 20 20 20 28 71 75 6f 74 69 65 6e 74         (quotient
0300: 20 28 76 65 63 74 6f 72 2d 6c 65 6e 67 74 68 20   (vector-length 
0310: 73 68 61 70 65 29 20 32 29 0a 20 20 20 20 20 20  shape) 2).      
0320: 20 20 20 20 20 20 20 20 20 20 28 61 72 72 61 79            (array
0330: 3a 69 6e 64 65 78 20 61 29 0a 20 20 20 20 20 20  :index a).      
0340: 20 20 20 20 20 20 20 20 20 20 78 29 0a 20 20 20            x).   
0350: 20 20 20 20 20 20 20 20 20 20 20 20 28 69 66 20              (if 
0360: 28 69 6e 74 65 67 65 72 3f 20 78 29 0a 20 20 20  (integer? x).   
0370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0380: 28 61 72 72 61 79 3a 76 65 63 74 6f 72 2d 69 6e  (array:vector-in
0390: 64 65 78 20 28 61 72 72 61 79 3a 69 6e 64 65 78  dex (array:index
03a0: 20 61 29 20 78 73 29 0a 20 20 20 20 20 20 20 20   a) xs).        
03b0: 20 20 20 20 20 20 20 20 20 20 20 28 69 66 20 28             (if (
03c0: 61 72 72 61 79 3a 61 72 72 61 79 3f 20 78 29 0a  array:array? x).
03d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
03e0: 20 20 20 20 20 20 20 28 61 72 72 61 79 3a 69 6e         (array:in
03f0: 64 65 78 2f 61 72 72 61 79 0a 20 20 20 20 20 20  dex/array.      
0400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0410: 20 20 28 71 75 6f 74 69 65 6e 74 20 28 76 65 63    (quotient (vec
0420: 74 6f 72 2d 6c 65 6e 67 74 68 20 73 68 61 70 65  tor-length shape
0430: 29 20 32 29 0a 20 20 20 20 20 20 20 20 20 20 20  ) 2).           
0440: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 61 72               (ar
0450: 72 61 79 3a 69 6e 64 65 78 20 61 29 0a 20 20 20  ray:index a).   
0460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0470: 20 20 20 20 20 28 61 72 72 61 79 3a 76 65 63 74       (array:vect
0480: 6f 72 20 78 29 0a 20 20 20 20 20 20 20 20 20 20  or x).          
0490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 61                (a
04a0: 72 72 61 79 3a 69 6e 64 65 78 20 78 29 29 0a 20  rray:index x)). 
04b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04c0: 20 20 20 20 20 20 28 65 72 72 6f 72 20 22 61 72        (error "ar
04d0: 72 61 79 2d 72 65 66 3a 20 62 61 64 20 69 6e 64  ray-ref: bad ind
04e0: 65 78 20 6f 62 6a 65 63 74 22 29 29 29 29 29 29  ex object"))))))
04f0: 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 61 72  )))..(define (ar
0500: 72 61 79 2d 73 65 74 21 20 61 20 78 20 2e 20 78  ray-set! a x . x
0510: 73 29 0a 20 20 28 6f 72 20 28 61 72 72 61 79 3a  s).  (or (array:
0520: 61 72 72 61 79 3f 20 61 29 0a 20 20 20 20 20 20  array? a).      
0530: 28 65 72 72 6f 72 20 22 61 72 72 61 79 2d 73 65  (error "array-se
0540: 74 21 3a 20 6e 6f 74 20 61 6e 20 61 72 72 61 79  t!: not an array
0550: 22 29 29 0a 20 20 28 6c 65 74 20 28 28 73 68 61  ")).  (let ((sha
0560: 70 65 20 28 61 72 72 61 79 3a 73 68 61 70 65 20  pe (array:shape 
0570: 61 29 29 29 0a 20 20 20 20 28 69 66 20 28 6e 75  a))).    (if (nu
0580: 6c 6c 3f 20 78 73 29 0a 20 20 20 20 20 20 20 20  ll? xs).        
0590: 28 61 72 72 61 79 3a 63 68 65 63 6b 2d 69 6e 64  (array:check-ind
05a0: 69 63 65 73 20 22 61 72 72 61 79 2d 73 65 74 21  ices "array-set!
05b0: 22 20 27 28 29 20 73 68 61 70 65 29 0a 20 20 20  " '() shape).   
05c0: 20 20 20 20 20 28 69 66 20 28 76 65 63 74 6f 72       (if (vector
05d0: 3f 20 78 29 0a 20 20 20 20 20 20 20 20 20 20 20  ? x).           
05e0: 20 28 61 72 72 61 79 3a 63 68 65 63 6b 2d 69 6e   (array:check-in
05f0: 64 65 78 2d 76 65 63 74 6f 72 20 22 61 72 72 61  dex-vector "arra
0600: 79 2d 73 65 74 21 22 20 78 20 73 68 61 70 65 29  y-set!" x shape)
0610: 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 69 66  .            (if
0620: 20 28 69 6e 74 65 67 65 72 3f 20 78 29 0a 20 20   (integer? x).  
0630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 61                (a
0640: 72 72 61 79 3a 63 68 65 63 6b 2d 69 6e 64 69 63  rray:check-indic
0650: 65 73 2e 6f 20 22 61 72 72 61 79 2d 73 65 74 21  es.o "array-set!
0660: 22 20 28 63 6f 6e 73 20 78 20 78 73 29 20 73 68  " (cons x xs) sh
0670: 61 70 65 29 0a 20 20 20 20 20 20 20 20 20 20 20  ape).           
0680: 20 20 20 20 20 28 69 66 20 28 61 72 72 61 79 3a       (if (array:
0690: 61 72 72 61 79 3f 20 78 29 0a 20 20 20 20 20 20  array? x).      
06a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 61                (a
06b0: 72 72 61 79 3a 63 68 65 63 6b 2d 69 6e 64 65 78  rray:check-index
06c0: 2d 61 63 74 6f 72 20 22 61 72 72 61 79 2d 73 65  -actor "array-se
06d0: 74 21 22 20 78 20 73 68 61 70 65 29 0a 20 20 20  t!" x shape).   
06e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06f0: 20 28 65 72 72 6f 72 20 22 6e 6f 74 20 61 6e 20   (error "not an 
0700: 69 6e 64 65 78 20 6f 62 6a 65 63 74 22 29 29 29  index object")))
0710: 29 29 0a 20 20 20 20 28 69 66 20 28 6e 75 6c 6c  )).    (if (null
0720: 3f 20 78 73 29 0a 20 20 20 20 20 20 20 20 28 76  ? xs).        (v
0730: 65 63 74 6f 72 2d 73 65 74 21 20 28 61 72 72 61  ector-set! (arra
0740: 79 3a 76 65 63 74 6f 72 20 61 29 20 28 76 65 63  y:vector a) (vec
0750: 74 6f 72 2d 72 65 66 20 28 61 72 72 61 79 3a 69  tor-ref (array:i
0760: 6e 64 65 78 20 61 29 20 30 29 20 78 29 0a 20 20  ndex a) 0) x).  
0770: 20 20 20 20 20 20 28 69 66 20 28 76 65 63 74 6f        (if (vecto
0780: 72 3f 20 78 29 0a 20 20 20 20 20 20 20 20 20 20  r? x).          
0790: 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21 20 28    (vector-set! (
07a0: 61 72 72 61 79 3a 76 65 63 74 6f 72 20 61 29 0a  array:vector a).
07b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07c0: 20 20 20 20 20 20 20 20 20 28 61 72 72 61 79 3a           (array:
07d0: 69 6e 64 65 78 2f 76 65 63 74 6f 72 0a 20 20 20  index/vector.   
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07f0: 20 20 20 20 20 20 20 28 71 75 6f 74 69 65 6e 74         (quotient
0800: 20 28 76 65 63 74 6f 72 2d 6c 65 6e 67 74 68 20   (vector-length 
0810: 73 68 61 70 65 29 20 32 29 0a 20 20 20 20 20 20  shape) 2).      
0820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0830: 20 20 20 20 28 61 72 72 61 79 3a 69 6e 64 65 78      (array:index
0840: 20 61 29 0a 20 20 20 20 20 20 20 20 20 20 20 20   a).            
0850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 78 29                x)
0860: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0870: 20 20 20 20 20 20 20 20 20 20 28 63 61 72 20 78            (car x
0880: 73 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  s)).            
0890: 28 69 66 20 28 69 6e 74 65 67 65 72 3f 20 78 29  (if (integer? x)
08a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
08b0: 20 28 6c 65 74 20 28 28 76 20 28 61 72 72 61 79   (let ((v (array
08c0: 3a 76 65 63 74 6f 72 20 61 29 29 0a 20 20 20 20  :vector a)).    
08d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08e0: 20 20 28 69 20 28 61 72 72 61 79 3a 69 6e 64 65    (i (array:inde
08f0: 78 20 61 29 29 0a 20 20 20 20 20 20 20 20 20 20  x a)).          
0900: 20 20 20 20 20 20 20 20 20 20 20 20 28 72 20 28              (r (
0910: 71 75 6f 74 69 65 6e 74 20 28 76 65 63 74 6f 72  quotient (vector
0920: 2d 6c 65 6e 67 74 68 20 73 68 61 70 65 29 20 32  -length shape) 2
0930: 29 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))).            
0940: 20 20 20 20 20 20 28 64 6f 20 28 28 73 75 6d 20        (do ((sum 
0950: 28 2a 20 28 76 65 63 74 6f 72 2d 72 65 66 20 69  (* (vector-ref i
0960: 20 30 29 20 78 29 0a 20 20 20 20 20 20 20 20 20   0) x).         
0970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0980: 20 20 20 28 2b 20 73 75 6d 20 28 2a 20 28 76 65     (+ sum (* (ve
0990: 63 74 6f 72 2d 72 65 66 20 69 20 6b 29 20 28 63  ctor-ref i k) (c
09a0: 61 72 20 6b 73 29 29 29 29 0a 20 20 20 20 20 20  ar ks)))).      
09b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09c0: 20 28 6b 73 20 78 73 20 28 63 64 72 20 6b 73 29   (ks xs (cdr ks)
09d0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
09e0: 20 20 20 20 20 20 20 20 20 28 6b 20 31 20 28 2b           (k 1 (+
09f0: 20 6b 20 31 29 29 29 0a 20 20 20 20 20 20 20 20   k 1))).        
0a00: 20 20 20 20 20 20 20 20 20 20 20 20 28 28 3d 20              ((= 
0a10: 6b 20 72 29 0a 20 20 20 20 20 20 20 20 20 20 20  k r).           
0a20: 20 20 20 20 20 20 20 20 20 20 28 76 65 63 74 6f            (vecto
0a30: 72 2d 73 65 74 21 20 76 20 28 2b 20 73 75 6d 20  r-set! v (+ sum 
0a40: 28 76 65 63 74 6f 72 2d 72 65 66 20 69 20 6b 29  (vector-ref i k)
0a50: 29 20 28 63 61 72 20 6b 73 29 29 29 29 29 0a 20  ) (car ks))))). 
0a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
0a70: 69 66 20 28 61 72 72 61 79 3a 61 72 72 61 79 3f  if (array:array?
0a80: 20 78 29 0a 20 20 20 20 20 20 20 20 20 20 20 20   x).            
0a90: 20 20 20 20 20 20 20 20 28 76 65 63 74 6f 72 2d          (vector-
0aa0: 73 65 74 21 20 28 61 72 72 61 79 3a 76 65 63 74  set! (array:vect
0ab0: 6f 72 20 61 29 0a 20 20 20 20 20 20 20 20 20 20  or a).          
0ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ad0: 20 20 20 20 20 20 20 28 61 72 72 61 79 3a 69 6e         (array:in
0ae0: 64 65 78 2f 61 72 72 61 79 0a 20 20 20 20 20 20  dex/array.      
0af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b00: 20 20 20 20 20 20 20 20 20 20 20 20 28 71 75 6f              (quo
0b10: 74 69 65 6e 74 20 28 76 65 63 74 6f 72 2d 6c 65  tient (vector-le
0b20: 6e 67 74 68 20 73 68 61 70 65 29 20 32 29 0a 20  ngth shape) 2). 
0b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b50: 20 28 61 72 72 61 79 3a 69 6e 64 65 78 20 61 29   (array:index a)
0b60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b80: 20 20 20 28 61 72 72 61 79 3a 76 65 63 74 6f 72     (array:vector
0b90: 20 78 29 0a 20 20 20 20 20 20 20 20 20 20 20 20   x).            
0ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bb0: 20 20 20 20 20 20 28 61 72 72 61 79 3a 69 6e 64        (array:ind
0bc0: 65 78 20 78 29 29 0a 20 20 20 20 20 20 20 20 20  ex x)).         
0bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0be0: 20 20 20 20 20 20 20 20 28 63 61 72 20 78 73 29          (car xs)
0bf0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
0c00: 20 20 20 20 20 20 28 65 72 72 6f 72 20 28 73 74        (error (st
0c10: 72 69 6e 67 2d 61 70 70 65 6e 64 0a 20 20 20 20  ring-append.    
0c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c30: 20 20 20 20 20 20 20 20 22 61 72 72 61 79 2d 73          "array-s
0c40: 65 74 21 3a 20 62 61 64 20 69 6e 64 65 78 20 6f  et!: bad index o
0c50: 62 6a 65 63 74 3a 20 22 0a 20 20 20 20 20 20 20  bject: ".       
0c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c70: 20 20 20 20 20 28 61 72 72 61 79 3a 74 68 69 6e       (array:thin
0c80: 67 2d 3e 73 74 72 69 6e 67 20 78 29 29 29 29 29  g->string x)))))
0c90: 29 29 29 29 0a                                   )))).