diff --git a/collects/racket/sequence.rkt b/collects/racket/sequence.rkt index 2000993e71..bd2a59ffa8 100644 --- a/collects/racket/sequence.rkt +++ b/collects/racket/sequence.rkt @@ -41,16 +41,19 @@ (unless (sequence? s) (raise-argument-error 'sequence-ref "sequence?" s)) (unless (exact-nonnegative-integer? i) (raise-argument-error 'sequence-ref "exact-nonnegative-integer?" i)) - (let ([v (for/fold ([c #f]) ([v (in-values-sequence s)] - [i (in-range (add1 i))]) - v)]) - (if (list? v) - (apply values v) - (raise-arguments-error - 'sequence-ref - "sequence ended before index" - "index" (add1 i) - "sequence" s)))) + (let ([v (for/fold ([c #f]) ([v (in-values*-sequence s)] + [j (in-range (add1 i))] + #:unless (j . < . i)) + (or v '(#f)))]) + (cond + [(not v) + (raise-arguments-error + 'sequence-ref + "sequence ended before index" + "index" i + "sequence" s)] + [(list? v) (apply values v)] + [else v]))) (define (sequence-tail seq i) (unless (sequence? seq) (raise-argument-error 'sequence-tail "sequence?" seq)) diff --git a/collects/tests/racket/sequence.rktl b/collects/tests/racket/sequence.rktl index 030554ce5a..e997e82dea 100644 --- a/collects/tests/racket/sequence.rktl +++ b/collects/tests/racket/sequence.rktl @@ -43,8 +43,12 @@ (test 0 'sequence-ref (sequence-ref (in-naturals) 0)) (test 1 'sequence-ref (sequence-ref (in-naturals) 1)) (test 25 'sequence-ref (sequence-ref (in-naturals) 25)) + (test #f 'sequence-ref (sequence-ref '(#t #t #f) 2)) (when (sequence? 10) (test 3 sequence-ref 10 3)) + (when (sequence? #hash()) + (test-values '(a "a") (lambda () (sequence-ref (in-hash #hash((a . "a"))) 0)))) + (err/rt-test (sequence-ref (in-string "a") 2) exn:fail?) (arity-test sequence-tail 2 2) (err/rt-test (sequence-tail (in-naturals) -1) exn:fail?)