diff --git a/lib/srfi/231/test.sld b/lib/srfi/231/test.sld index fa41cb39..81404ae2 100644 --- a/lib/srfi/231/test.sld +++ b/lib/srfi/231/test.sld @@ -3512,7 +3512,9 @@ OTHER DEALINGS IN THE SOFTWARE. ((array-getter a) 3 4)) (let ((curried-a (array-curry a 1))) (test '(3 4) - ((array-getter ((array-getter curried-a) 3)) 4)))) + ((array-getter ((array-getter curried-a) 3)) 4)) + (test (array->list a) + (array->list (array-decurry curried-a))))) (test 0. ((array-getter sparse-array) 12345 6789)) diff --git a/lib/srfi/231/transforms.scm b/lib/srfi/231/transforms.scm index fc9f5b56..a53a5f2b 100644 --- a/lib/srfi/231/transforms.scm +++ b/lib/srfi/231/transforms.scm @@ -657,12 +657,21 @@ res)))) (define (array-decurry a . o) - (let ((storage (if (pair? o) (car o) generic-storage-class)) - (mutable? (if (and (pair? o) (pair? (cdr o))) - (cadr o) - (specialized-array-default-mutable?))) - (safe? (if (and (pair? o) (pair? (cdr o)) (pair? (cddr o))) - (car (cddr o)) - (specialized-array-default-safe?)))) - (error "TODO: array-decurry unimplemented"))) - + (let* ((storage (if (pair? o) (car o) generic-storage-class)) + (mutable? (if (and (pair? o) (pair? (cdr o))) + (cadr o) + (specialized-array-default-mutable?))) + (safe? (if (and (pair? o) (pair? (cdr o)) (pair? (cddr o))) + (car (cddr o)) + (specialized-array-default-safe?))) + (a-domain (array-domain a)) + (elt0 (apply array-ref a (interval-lower-bounds->list a-domain))) + (elt-domain (array-domain elt0)) + (domain (interval-cartesian-product a-domain elt-domain)) + (res (make-specialized-array domain storage mutable? safe?)) + (curried-res (array-curry res (interval-dimension elt-domain)))) + ;; Prepare a res with the flattened domain, create a new curried + ;; view of the res with the same domain as a, and assign each + ;; curried view from a to the res. + (array-for-each array-assign! curried-res a) + res))