generalize `flvector-copy' to support start and end indices
This commit is contained in:
parent
beb2175456
commit
3866c3e450
|
@ -86,7 +86,27 @@
|
|||
(add1 i))
|
||||
v))))))
|
||||
|
||||
(define (flvector-copy flv)
|
||||
(for/flvector #:length (flvector-length flv)
|
||||
((x (in-flvector flv)))
|
||||
x))
|
||||
(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))
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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?]{
|
||||
|
||||
|
|
|
@ -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).
|
||||
|
|
|
@ -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)
|
Loading…
Reference in New Issue
Block a user