Skip to content

Commit 418d5c8

Browse files
committed
Build up empty arrays of higher dimensions for list/vector*->array
Issue #962.
1 parent f9e3ed1 commit 418d5c8

File tree

2 files changed

+29
-7
lines changed

2 files changed

+29
-7
lines changed

lib/srfi/231/test.sld

+16
Original file line numberDiff line numberDiff line change
@@ -1821,10 +1821,26 @@
18211821
(array-every equal?
18221822
(list*->array 0 '())
18231823
(make-array (make-interval '#()) (lambda () '()))))
1824+
(test-assert
1825+
(array-every equal?
1826+
(list*->array 1 '())
1827+
(make-array (make-interval '#(0)) (lambda () '()))))
1828+
(test-assert
1829+
(array-every equal?
1830+
(list*->array 2 '())
1831+
(make-array (make-interval '#(0 0)) (lambda () '()))))
18241832
(test-assert
18251833
(array-every equal?
18261834
(vector*->array 0 '())
18271835
(make-array (make-interval '#()) (lambda () '()))))
1836+
(test-assert
1837+
(array-every equal?
1838+
(vector*->array 1 '())
1839+
(make-array (make-interval '#(0)) (lambda () '()))))
1840+
(test-assert
1841+
(array-every equal?
1842+
(vector*->array 2 '())
1843+
(make-array (make-interval '#(0 0)) (lambda () '()))))
18281844
(test-error (array-any 1 2))
18291845
(test-error (array-any list 1))
18301846
(test-error (array-any list

lib/srfi/231/transforms.scm

+13-7
Original file line numberDiff line numberDiff line change
@@ -524,15 +524,17 @@
524524
(error "can't reshape" array new-domain)))))
525525

526526
(define (flatten ls d)
527-
(if (and (positive? d) (pair? (car ls)))
527+
(if (and (positive? d) (pair? ls) (pair? (car ls)))
528528
(append-map (lambda (x) (flatten x (- d 1))) ls)
529529
ls))
530530

531531
(define (list*->array dimension nested-ls . o)
532532
(let lp ((ls nested-ls) (lens '()) (d dimension))
533533
(cond
534534
((positive? d)
535-
(lp (car ls) (cons (length ls) lens) (- d 1)))
535+
(if (null? ls)
536+
(lp '() (cons 0 lens) (- d 1))
537+
(lp (car ls) (cons (length ls) lens) (- d 1))))
536538
(else
537539
(apply list->array
538540
(make-interval (list->vector (reverse lens)))
@@ -572,16 +574,20 @@
572574
(interval-lower-bound domain 0)))))))
573575

574576
(define (flatten-vector->list vec d)
575-
(if (and (positive? d) (vector? (vector-ref vec 0)))
576-
(append-map (lambda (x) (flatten-vector->list x (- d 1)))
577-
(vector->list vec))
578-
(vector->list vec)))
577+
(cond
578+
((not (vector? vec)) '())
579+
((and (positive? d) (vector? (vector-ref vec 0)))
580+
(append-map (lambda (x) (flatten-vector->list x (- d 1)))
581+
(vector->list vec)))
582+
(else (vector->list vec))))
579583

580584
(define (vector*->array dimension nested-vec . o)
581585
(let lp ((vec nested-vec) (lens '()) (d dimension))
582586
(cond
583587
((positive? d)
584-
(lp (vector-ref vec 0) (cons (vector-length vec) lens) (- d 1)))
588+
(if (vector? vec)
589+
(lp (vector-ref vec 0) (cons (vector-length vec) lens) (- d 1))
590+
(lp vec (cons 0 lens) (- d 1))))
585591
(else
586592
(apply list->array
587593
(make-interval (reverse-list->vector lens))

0 commit comments

Comments
 (0)