Add range to racket/list.

This commit is contained in:
Vincent St-Amour 2012-02-25 17:37:16 -05:00
parent b323acb999
commit f420edc5ee
3 changed files with 45 additions and 1 deletions

View File

@ -31,7 +31,8 @@
;; convenience
append-map
filter-not
shuffle)
shuffle
range)
(define (first x)
(if (and (pair? x) (list? x))
@ -362,3 +363,14 @@
(define (argmin f xs) (mk-min < 'argmin f xs))
(define (argmax f xs) (mk-min > 'argmax f xs))
;; similar to in-range, but returns a list
(define range
(case-lambda
[(end) (range 0 end 1)]
[(start end) (range start end 1)]
[(start end step)
(unless (real? start) (raise-type-error 'range "real-number" start))
(unless (real? end) (raise-type-error 'range "real-number" end))
(unless (real? step) (raise-type-error 'range "real-number" step))
(for/list ([i (in-range start end step)]) i)]))

View File

@ -1012,6 +1012,22 @@ the result of @racket[proc]. Signals an error on an empty list.
(argmax car '((3 pears) (3 oranges)))
]}
@defproc*[([(range [end real?]) list?]
[(range [start real?] [end real?] [step real? 1]) list?])]{
Returns a list of numbers starting at @racket[start] and whose successive
elements are computed by adding @racket[step] to their predecessor until
@racket[end] (excluded) is reached.
If no starting point is provided, @racket[0] is used. If no @racket[step]
argument is provided, @racket[1] is used.
@mz-examples[#:eval list-eval
(range 10)
(range 10 20)
(range 20 40 2)
(range 20 10 -1)
(range 10 15 1.5)
]}
@close-eval[list-eval]
@; ----------------------------------------

View File

@ -378,7 +378,23 @@
(err/rt-test (argmax (lambda (x) x) (list +i)) (check-regs #rx"argmax" #rx"procedure that returns real numbers"))
(err/rt-test (argmax (lambda (x) x) (list)) (check-regs #rx"argmax" #rx"non-empty list")))
;; ---------- range ----------
(let ()
(test '(0 1 2 3) range 4)
(test '() range 0)
(test '(0 1 2 3 4 5 6 7) range 8)
(test '() range 3 2)
(test '(3) range 3 2 -1)
(test '(3 4 5 6 7 8) range 3 9)
(test '(3 5 7) range 3 9 2)
(test '(3 3.5 4.0 4.5 5.0 5.5 6.0 6.5 7.0 7.5 8.0 8.5) range 3 9 0.5)
(test '(9 7 5) range 9 3 -2)
(test '(0 1 2 3 4 5 6 7 8 9) range 10)
(test '(10 11 12 13 14 15 16 17 18 19) range 10 20)
(test '(20 22 24 26 28 30 32 34 36 38) range 20 40 2)
(test '(20 19 18 17 16 15 14 13 12 11) range 20 10 -1)
(test '(10 11.5 13.0 14.5) range 10 15 1.5))
;; ---------- check no collisions with srfi/1 ----------
(test (void)