@@ -939,6 +939,7 @@ OTHER DEALINGS IN THE SOFTWARE.
939939 body ; ; the backing store for this array
940940 indexer ; ; see below
941941 safe? ; ; do we check whether bounds (in getters and setters) and values (in setters) are valid
942+ ordered ; ; cached %%compute-array-elements-in-order? (#f: unknown 0: false)
942943 )
943944
944945(define specialized-array-default-safe?
@@ -986,6 +987,7 @@ OTHER DEALINGS IN THE SOFTWARE.
986987 #f ; body
987988 #f ; indexer
988989 #f ; safe?
990+ #f ; ordered (unknown)
989991 )))))
990992
991993(define (array? x )
@@ -1565,7 +1567,7 @@ OTHER DEALINGS IN THE SOFTWARE.
15651567 (else
15661568 (%%array-safe? obj))))
15671569
1568- (define (%%array-elements-in-order? array)
1570+ (define (%%compute- array-elements-in-order? array)
15691571 (let ((domain (%%array-domain array))
15701572 (indexer (%%array-indexer array)))
15711573 (case (%%interval-dimension domain)
@@ -1673,6 +1675,16 @@ OTHER DEALINGS IN THE SOFTWARE.
16731675 ; ; return a proper boolean instead of the volume of the domain
16741676 #t ))))))
16751677
1678+ (define (%%array-elements-in-order? array)
1679+ (let ((ordering-known (%%array-ordered array)))
1680+ (cond
1681+ ((not ordering-known)
1682+ (let ((ordered (%%compute-array-elements-in-order? array)))
1683+ (%%array-ordered-set! array (if ordered 1 0 ))
1684+ ordered))
1685+ ((0 ) #f )
1686+ (else #t ))))
1687+
16761688(define (array-elements-in-order? array )
16771689 (cond ((not (specialized-array? array))
16781690 (error " array-elements-in-order?: The argument is not a specialized array: " array))
@@ -1842,7 +1854,9 @@ OTHER DEALINGS IN THE SOFTWARE.
18421854 storage-class
18431855 body
18441856 indexer
1845- safe?))))
1857+ safe?
1858+ #f ; ; ordered: unknown
1859+ ))))
18461860
18471861(define (%%interval->basic-indexer interval)
18481862 (case (%%interval-dimension interval)
0 commit comments