racket/sequence: fix `sequence-ref' for a too-large index
This commit is contained in:
parent
d977a2c65d
commit
0f47ec4af7
|
@ -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)
|
||||
(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" (add1 i)
|
||||
"sequence" s))))
|
||||
"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))
|
||||
|
|
|
@ -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?)
|
||||
|
|
Loading…
Reference in New Issue
Block a user