racket/collects/math/private/array/array-sequence.rkt
Neil Toronto 3670916a11 Initial commit for `math/array' documentation; about 65% finished
Replaced pointwise operators with macros that expand to applications of `array-map'; allows more precise return types and reduces compilation time

Changed literal array syntax to use #() to delimit rows instead of [] (still suggest using square parens, though)

Minor refactoring

Fixed a macro so that the only problem with "array-tests.rkt" now is that typed/rackunit is b0rked
2012-11-24 22:13:24 -07:00

111 lines
4.1 KiB
Racket

#lang racket/base
(require (for-syntax racket/base)
typed/untyped-utils
typed-racket/base-env/prims
racket/unsafe/ops
"array-struct.rkt"
"utils.rkt"
(except-in "typed-array-sequence.rkt" in-array-indexes))
(require/untyped-contract
"typed-array-sequence.rkt"
[in-array-indexes ((Vectorof Integer) -> (Sequenceof (Vectorof Index)))])
(provide (rename-out [in-array-clause in-array]
[in-array-indexes-clause in-array-indexes]
[in-unsafe-array-indexes-clause in-unsafe-array-indexes])
in-array-axis
array->array-list
array-list->array)
(define-sequence-syntax in-array-clause
(λ () #'in-array)
(λ (stx)
(syntax-case stx ()
[[(x) (_ arr-expr)]
(syntax/loc stx
[(x)
(:do-in
([(ds size dims js proc)
(plet: (A) ([arr : (Array A) arr-expr])
(cond [(array? arr)
(define ds (array-shape arr))
(define dims (vector-length ds))
(define size (array-size arr))
(define proc (unsafe-array-proc arr))
(define: js : Indexes (make-vector dims 0))
(values ds size dims js proc)]
[else
(raise-argument-error 'in-array "Array" arr)]))])
(void)
([j 0])
(unsafe-fx< j size)
([(x) (proc js)])
#true
#true
[(begin (next-indexes! ds dims js)
(unsafe-fx+ j 1))])])]
[[_ clause] (raise-syntax-error 'in-array "expected (in-array <Array>)" #'clause #'clause)])))
(define-sequence-syntax in-array-indexes-clause
(λ () #'in-array-indexes)
(λ (stx)
(syntax-case stx ()
[[(x) (_ ds-expr)]
(syntax/loc stx
[(x)
(:do-in
([(ds size dims js)
(let*: ([ds : In-Indexes ds-expr]
[ds : Indexes (check-array-shape
ds (λ () (raise-argument-error 'in-array-indexes "Indexes"
ds)))])
(define dims (vector-length ds))
(define size (array-shape-size ds))
(cond [(index? size) (define: js : Indexes (make-vector dims 0))
(values ds size dims js)]
[else (error 'in-array-indexes
"array size ~e (for shape ~e) is too large (is not an Index)"
size ds)]))])
(void)
([j 0])
(unsafe-fx< j size)
([(x) (vector-copy-all js)])
#true
#true
[(begin (next-indexes! ds dims js)
(unsafe-fx+ j 1))])])]
[[_ clause]
(raise-syntax-error 'in-array-indexes "expected (in-array-indexes <Indexes>)"
#'clause #'clause)])))
(define-sequence-syntax in-unsafe-array-indexes-clause
(λ () #'in-array-indexes)
(λ (stx)
(syntax-case stx ()
[[(x) (_ ds-expr)]
(syntax/loc stx
[(x)
(:do-in
([(ds size dims js)
(let: ([ds : Indexes ds-expr])
(define dims (vector-length ds))
(define size (array-shape-size ds))
(cond [(index? size) (define: js : Indexes (make-vector dims 0))
(values ds size dims js)]
[else (error 'in-array-indexes
"array size ~e (for shape ~e) is too large (is not an Index)"
size ds)]))])
(void)
([j 0])
(unsafe-fx< j size)
([(x) js])
#true
#true
[(begin (next-indexes! ds dims js)
(unsafe-fx+ j 1))])])]
[[_ clause]
(raise-syntax-error 'in-array-indexes "expected (in-unsafe-array-indexes <Indexes>)"
#'clause #'clause)])))