racket/collects/math/private/array/array-fold.rkt
Neil Toronto 986e695bd5 Made arrays strict by default; please merge to release
* Added parameter `array-strictness', default #t

* Added `array-default-strict!' and `array-default-strict', which act
  like the functions without "default" in the name when
  `array-strictness' is #t; otherwise they do nothing

* Lots of small changes to existing array functions, mostly to ensure
  computations are done using nonstrict arrays, but return values are
  strict when `array-strictness' is #t

* Added strictness tests

* Added tests to ensure untyped code can use `math/array'

* Rewrote `array-map' exported to untyped code using untyped Racket

* Rearranged a lot of `math/array' documentation
2013-01-15 13:53:28 -07:00

72 lines
2.1 KiB
Racket

#lang racket/base
(require (for-syntax racket/base)
(only-in typed/racket/base assert index?)
"array-struct.rkt"
"array-pointwise.rkt"
"typed-array-fold.rkt")
;; ===================================================================================================
;; Standard folds
(define-syntax-rule (define-axis-fold name f)
(define-syntax (name stx)
(syntax-case stx ()
[(_ arr k) (syntax/loc stx (array-axis-fold arr k f))]
[(_ arr k init) (syntax/loc stx (array-axis-fold arr k f init))])))
(define-syntax-rule (define-all-fold name f)
(define-syntax (name stx)
(syntax-case stx ()
[(_ arr) (syntax/loc stx (array-all-fold arr f))]
[(_ arr init) (syntax/loc stx (array-all-fold arr f init))])))
(define-axis-fold array-axis-sum +)
(define-axis-fold array-axis-prod *)
(define-axis-fold array-axis-min min)
(define-axis-fold array-axis-max max)
(define-all-fold array-all-sum +)
(define-all-fold array-all-prod *)
(define-all-fold array-all-min min)
(define-all-fold array-all-max max)
(define-syntax-rule (array-count f arr ...)
(assert
(parameterize ([array-strictness #f])
(array-all-sum (inline-array-map (λ (b) (if b 1 0))
(array-map f arr ...))
0))
index?))
(define-syntax-rule (array-andmap pred? arr ...)
(parameterize ([array-strictness #f])
(array-all-and (array-map pred? arr ...))))
(define-syntax-rule (array-ormap pred? arr ...)
(parameterize ([array-strictness #f])
(array-all-or (array-map pred? arr ...))))
(provide array-axis-fold
array-axis-sum
array-axis-prod
array-axis-min
array-axis-max
array-axis-count
array-axis-and
array-axis-or
array-fold
array-all-fold
array-all-sum
array-all-prod
array-all-min
array-all-max
array-all-and
array-all-or
array-count
array-andmap
array-ormap
array-axis-reduce
unsafe-array-axis-reduce
array->list-array)