diff --git a/collects/racket/flonum.rkt b/collects/racket/flonum.rkt index 0070576627..0a9869bc22 100644 --- a/collects/racket/flonum.rkt +++ b/collects/racket/flonum.rkt @@ -86,7 +86,27 @@ (add1 i)) v)))))) -(define (flvector-copy flv) - (for/flvector #:length (flvector-length flv) - ((x (in-flvector flv))) - x)) \ No newline at end of file +(define (flvector-copy flv [start 0] [end (and (flvector? flv) (flvector-length flv))]) + (unless (flvector? flv) + (raise-type-error 'flvector-copy "flvector" flv)) + (unless (exact-nonnegative-integer? start) + (raise-type-error 'flvector-copy "non-negative exact integer" start)) + (unless (exact-nonnegative-integer? end) + (raise-type-error 'flvector-copy "non-negative exact integer" end)) + (let ([orig-len (flvector-length flv)]) + (unless (<= start end orig-len) + (unless (<= start orig-len) + (raise-mismatch-error 'flvector-copy + (format "start index ~s out of range [~a, ~a] for flvector: " + start 0 orig-len) + flv)) + (raise-mismatch-error 'flvector-copy + (format "end index ~s out of range [~a, ~a] for flvector: " + end start orig-len) + flv))) + (let* ([len (- end start)] + [vec (make-flvector len)]) + (for ([i (in-range len)]) + (flvector-set! vec i (flvector-ref flv (+ i start)))) + vec)) + diff --git a/collects/racket/vector.rkt b/collects/racket/vector.rkt index 1b777257f1..9d9ea1e6da 100644 --- a/collects/racket/vector.rkt +++ b/collects/racket/vector.rkt @@ -27,7 +27,7 @@ (unless (vector? v) (raise-type-error 'vector-copy "vector" v)) (unless (exact-nonnegative-integer? start) - (raise-type-error 'vector-copy "non-negative exact integer" 1 start)) + (raise-type-error 'vector-copy "non-negative exact integer" start)) (let ([len (vector-length v)]) (cond [(= len 0) diff --git a/collects/scribblings/reference/numbers.scrbl b/collects/scribblings/reference/numbers.scrbl index 3361c6aef8..19e08dde8b 100644 --- a/collects/scribblings/reference/numbers.scrbl +++ b/collects/scribblings/reference/numbers.scrbl @@ -1096,9 +1096,16 @@ Sets the inexact real number in slot @racket[pos] of @racket[vec]. The first slot is position @racket[0], and the last slot is one less than @racket[(flvector-length vec)].} -@defproc[(flvector-copy (v flvector?)) flvector?]{ +@defproc[(flvector-copy [vec flvector?] + [start exact-nonnegative-integer? 0] + [end exact-nonnegative-integer? (vector-length v)]) + flvector?]{ -Returns a fresh copy of @racket[v].} +Creates a fresh @tech{flvector} of size @racket[(- end start)], with all of the +elements of @racket[vec] from @racket[start] (inclusive) to +@racket[end] (exclusive). + +Returns a fresh copy of @racket[vec].} @defproc[(in-flvector (v flvector?)) sequence?]{ diff --git a/collects/scribblings/reference/vectors.scrbl b/collects/scribblings/reference/vectors.scrbl index 212fa523f0..a82378dcca 100644 --- a/collects/scribblings/reference/vectors.scrbl +++ b/collects/scribblings/reference/vectors.scrbl @@ -262,8 +262,11 @@ except that it can be faster. ]} -@defproc[(vector-copy [vec vector?] [start exact-nonnegative-integer? -0] [end exact-nonnegative-integer? (vector-length v)]) vector?]{ +@defproc[(vector-copy [vec vector?] + [start exact-nonnegative-integer? 0] + [end exact-nonnegative-integer? (vector-length v)]) + vector?]{ + Creates a fresh vector of size @racket[(- end start)], with all of the elements of @racket[vec] from @racket[start] (inclusive) to @racket[end] (exclusive). diff --git a/collects/tests/racket/flonum.rktl b/collects/tests/racket/flonum.rktl index 18da10cde7..9fda986cef 100644 --- a/collects/tests/racket/flonum.rktl +++ b/collects/tests/racket/flonum.rktl @@ -2,7 +2,7 @@ (Section 'flonum) -(require scheme/flonum) +(require racket/flonum) (define (flonum-close? fl1 fl2) (<= (flabs (fl- fl1 fl2)) @@ -70,6 +70,8 @@ (test vx 'flvector-copy vcx)) (flvector-set! vc 2 -10.0) (test 2.0 'flvector-copy (flvector-ref v 2)) - (test -10.0 'flvector-copy (flvector-ref vc 2)))) + (test -10.0 'flvector-copy (flvector-ref vc 2)) + (test '(2.0 3.0) 'flvector-copy (for/list ([i (in-flvector (flvector-copy v 2))]) i)) + (test '(2.0) 'flvector-copy (for/list ([i (in-flvector (flvector-copy v 2 3))]) i)))) (report-errs) \ No newline at end of file