diff --git a/pkgs/racket-doc/scribblings/reference/sequences.scrbl b/pkgs/racket-doc/scribblings/reference/sequences.scrbl index 4891e55e13..d1353b172e 100644 --- a/pkgs/racket-doc/scribblings/reference/sequences.scrbl +++ b/pkgs/racket-doc/scribblings/reference/sequences.scrbl @@ -158,8 +158,8 @@ each element in the sequence. (sequence? "word") (sequence? #\x)]} -@defproc*[([(in-range [end number?]) stream?] - [(in-range [start number?] [end number?] [step number? 1]) stream?])]{ +@defproc*[([(in-range [end real?]) stream?] + [(in-range [start real?] [end real?] [step real? 1]) stream?])]{ Returns a sequence (that is also a @tech{stream}) whose elements are numbers. The single-argument case @racket[(in-range end)] is equivalent to @racket[(in-range 0 end 1)]. The first number in the diff --git a/pkgs/racket-test-core/tests/racket/for.rktl b/pkgs/racket-test-core/tests/racket/for.rktl index ec943ccbe7..ffd8d4c455 100644 --- a/pkgs/racket-test-core/tests/racket/for.rktl +++ b/pkgs/racket-test-core/tests/racket/for.rktl @@ -450,7 +450,81 @@ #rx".*expected number of values not received.*") (test 1 'one (begin (for/fold () () (values)) 1)) +;; iterator contract tests +(err/rt-test (for ([x (in-range (sqrt -1))]) x) + exn:fail:contract? + #rx"expected\\: real\\?") +(err/rt-test (for ([x (in-range 1 (sqrt -1))]) x) + exn:fail:contract? + #rx"expected\\: real\\?") +(err/rt-test (for ([x (in-range 1 2 (sqrt -1))]) x) + exn:fail:contract? + #rx"expected\\: real\\?") +(test (* 10 pi) 'in-range-with-reals + (for/sum ([x (in-range 0 (+ (* 4 pi) .1) pi)]) x)) +(err/rt-test (for ([x (in-naturals 1.1)]) x) + exn:fail:contract? + #rx"expected\\: exact-nonnegative-integer\\?") +(err/rt-test (for ([x (in-naturals -1)]) x) + exn:fail:contract? + #rx"expected\\: exact-nonnegative-integer\\?") +(err/rt-test (for ([x (in-list 1)]) x) + exn:fail:contract? + #rx"expected\\: list\\?") +(err/rt-test (for ([x (in-list (vector 1 2 3))]) x) + exn:fail:contract? + #rx"expected\\: list\\?") +(err/rt-test (for ([x (in-list (mcons 1 '()))]) x) + exn:fail:contract? + #rx"expected\\: list\\?") +(err/rt-test (for ([x (in-mlist (list 1 2 3))]) x) + exn:fail:contract? + #rx"expected\\: mpair\\?") +(err/rt-test (for ([x (in-vector '(1 2))]) x) + exn:fail:contract? + #rx"expected\\: vector") +(err/rt-test (for ([x (in-vector (vector 1 2) -1)]) x) + exn:fail:contract? + #rx"starting index is out of range") +(err/rt-test (for ([x (in-vector (vector 1 2) 10)]) x) + exn:fail:contract? + #rx"starting index is out of range") +(err/rt-test (for ([x (in-vector (vector 1 2) 1.1)]) x) + exn:fail:contract? + #rx"expected\\: exact-integer\\?") +(err/rt-test (for ([x (in-vector (vector 1 2) 0 1.1)]) x) + exn:fail:contract? + #rx"expected\\: exact-integer\\?") +(err/rt-test (for ([x (in-vector (vector 1 2) 0 2 1.1)]) x) + exn:fail:contract? + #rx"expected:.*exact-integer\\?") +(err/rt-test (for ([x (in-vector (vector 1 2) 0 2 0)]) x) + exn:fail:contract? + #rx"expected:.*not/c zero\\?") +(err/rt-test (for ([x (in-port (vector 1 2))]) x) + exn:fail:contract? + #rx"expected:.*procedure-arity-includes/c 1") +(err/rt-test (for ([x (in-input-port-bytes (vector 1 2))]) x) + exn:fail:contract? + #rx"expected: input-port\\?") +(err/rt-test (for ([x (in-hash (vector 1 2))]) x) + exn:fail:contract? + #rx"expected: hash\\?") +(err/rt-test (for ([x (in-hash-pairs (vector 1 2))]) x) + exn:fail:contract? + #rx"expected: hash\\?") +(err/rt-test (for ([x (in-hash-keys (vector 1 2))]) x) + exn:fail:contract? + #rx"expected: hash\\?") +(err/rt-test (for ([x (in-hash-values (vector 1 2))]) x) + exn:fail:contract? + #rx"expected: hash\\?") +(err/rt-test (for ([x (in-hash (hash 1 2))]) x) + exn:fail:contract:arity? + #rx"expected number of values not received") + ;; for/fold syntax checking (syntax-test #'(for/fold () bad 1) #rx".*bad sequence binding clauses.*") + (report-errs) diff --git a/racket/collects/racket/private/for.rkt b/racket/collects/racket/private/for.rkt index 65b4defe5c..cd85fa3432 100644 --- a/racket/collects/racket/private/for.rkt +++ b/racket/collects/racket/private/for.rkt @@ -590,6 +590,7 @@ (values car cdr l pair? #f #f)) (define (in-mlist l) + (unless (mpair? l) (raise-argument-error 'in-mlist "mpair?" l)) (make-do-sequence (lambda () (:mlist-gen l)))) (define (:mlist-gen l)