From f420edc5eef6ab4bea68b3730edebdb91593759e Mon Sep 17 00:00:00 2001 From: Vincent St-Amour Date: Sat, 25 Feb 2012 17:37:16 -0500 Subject: [PATCH] Add range to racket/list. --- collects/racket/list.rkt | 14 +++++++++++++- collects/scribblings/reference/pairs.scrbl | 16 ++++++++++++++++ collects/tests/racket/list.rktl | 16 ++++++++++++++++ 3 files changed, 45 insertions(+), 1 deletion(-) diff --git a/collects/racket/list.rkt b/collects/racket/list.rkt index b5c8888049..ad085a9fa2 100644 --- a/collects/racket/list.rkt +++ b/collects/racket/list.rkt @@ -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)])) diff --git a/collects/scribblings/reference/pairs.scrbl b/collects/scribblings/reference/pairs.scrbl index 2e677f1d8c..23131bfa39 100644 --- a/collects/scribblings/reference/pairs.scrbl +++ b/collects/scribblings/reference/pairs.scrbl @@ -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] @; ---------------------------------------- diff --git a/collects/tests/racket/list.rktl b/collects/tests/racket/list.rktl index c29a4c4335..07de397754 100644 --- a/collects/tests/racket/list.rktl +++ b/collects/tests/racket/list.rktl @@ -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)