ashinn / chibi-scheme

Official chibi-scheme repository
Other
1.2k stars 142 forks source link

SRFI 231: Fix for array-tile #966

Closed gambiteer closed 2 months ago

gambiteer commented 2 months ago

All these should throw an error:

> chibi-scheme 
> (import (srfi 231))
> (array-tile (make-array (make-interval '#(4)) list) '#(#(0 3 0 -1 2)))
#<Array 140234477650720>
> (array-tile (make-array (make-interval '#(0)) list) '#(2))
#<Array 140234472000192>
> (array-tile (make-array (make-interval '#(0)) list) '#(#()))
#<Array 140234472321024>

I admit, the conditions on the scale factors is perhaps too complicated, but here's a fix all the same:

diff --git a/lib/srfi/231/transforms.scm b/lib/srfi/231/transforms.scm
index 0e4bb915..392c6230 100644
--- a/lib/srfi/231/transforms.scm
+++ b/lib/srfi/231/transforms.scm
@@ -159,9 +159,15 @@
                              sizes)))
   (assert
    (vector-every (lambda (s len)
-                   (if (exact-integer? s)
-                       (positive? s)
-                       (= (vector-fold + 0 s) len)))
+                   (if (zero? len)
+                       (and (vector? s)
+                            (not (zero? (vector-length s)))
+                            (vector-every zero? s))
+                       (or (and (exact-integer? s)
+                                (positive? s))
+                           (and (vector? s)
+                                (not (vector-any negative? s))
+                                (= (vector-fold + 0 s) len)))))
                  sizes
                  (interval-widths (array-domain array))))
   (let ((domain (make-interval