diff --git a/collects/racket/vector.rkt b/collects/racket/vector.rkt index 6ee211047f..1b777257f1 100644 --- a/collects/racket/vector.rkt +++ b/collects/racket/vector.rkt @@ -1,6 +1,6 @@ #lang racket/base -(provide vector-copy vector-map vector-map! vector-append +(provide vector-set*! vector-copy vector-map vector-map! vector-append vector-take vector-drop vector-split-at vector-take-right vector-drop-right vector-split-at-right vector-filter vector-filter-not @@ -8,6 +8,14 @@ vector-member vector-memq vector-memv) (require racket/unsafe/ops) +(define (vector-set*! v . pairs) + (unless (even? (length pairs)) + (error 'vector-set*! "expected an even number of association elements, but received an odd number: ~e" pairs)) + (let loop ([pairs pairs]) + (unless (null? pairs) + (vector-set! v (car pairs) (cadr pairs)) + (loop (cddr pairs))))) + ;; unchecked version of `vector-copy' ;; used at the implementation of many functions in this file (define (vector-copy* v start end) diff --git a/collects/scribblings/reference/vectors.scrbl b/collects/scribblings/reference/vectors.scrbl index 1043d8b8fd..1ef0308d35 100644 --- a/collects/scribblings/reference/vectors.scrbl +++ b/collects/scribblings/reference/vectors.scrbl @@ -67,8 +67,17 @@ slot is position @racket[0], and the last slot is one less than void?]{ Updates the slot @racket[pos] of @racket[vec] to contain @racket[v].} + +@defproc[(vector-set*! [vec (and/c vector? (not/c immutable?))] + [pos exact-nonnegative-integer?] + [v any/c] + ... + ...) + void?]{ - +Updates each slot @racket[pos] of @racket[vec] to contain each @racket[v]. +The update takes place from the left so later updates overwrite earlier updates.} + @defproc[(vector->list [vec vector?]) list?]{ Returns a list with the same length and elements as @racket[vec].} diff --git a/collects/tests/racket/dict.rktl b/collects/tests/racket/dict.rktl index e708254635..35fc6d0da8 100644 --- a/collects/tests/racket/dict.rktl +++ b/collects/tests/racket/dict.rktl @@ -53,6 +53,7 @@ (test (void) dict-set! d 1 "ONE") (test "ONE" dict-ref d 1) (test (void) dict-set*! d 1 (gensym) 1 "TWO") + (err/rt-test (dict-set*! d 1) exn:fail?) (test "TWO" dict-ref d 1) (test "TWO" dict-ref! d 1 (gensym))) (let ([cnt (dict-count d)] @@ -89,9 +90,11 @@ (begin (err/rt-test (dict-set* smaller 1 val)) (dict-set*! smaller 1 (gensym) 1 val) + (err/rt-test (dict-set*! smaller 1) exn:fail?) d) (begin (err/rt-test (dict-set*! smaller 1 val)) + (err/rt-test (dict-set* smaller 1) exn:fail?) (dict-set* smaller 1 (gensym) 1 val)))]) (test cnt dict-count bigger) (when (eq? val 'one) diff --git a/collects/tests/racket/vector.rktl b/collects/tests/racket/vector.rktl index 6857c7fc49..28dbd2dc3b 100644 --- a/collects/tests/racket/vector.rktl +++ b/collects/tests/racket/vector.rktl @@ -24,10 +24,18 @@ (err/rt-test (vector-ref #(4 5 6) -1)) (err/rt-test (vector-ref #(4 5 6) 2.0)) (err/rt-test (vector-ref #(4 5 6) "2")) -(test '#(0 ("Sue" "Sue") "Anna") 'vector-set +(test '#(0 ("Sue" "Sue") "Anna") 'vector-set! (let ((vec (vector 0 '(2 2 2 2) "Anna"))) (vector-set! vec 1 '("Sue" "Sue")) vec)) +(test '#(0 1 2) 'vector-set*! + (let ([vec (vector #f #f #f)]) + (vector-set*! vec + 0 (gensym) 0 0 + 1 (gensym) 1 1 + 2 (gensym) 2 2) + vec)) + (test '#(hi hi) make-vector 2 'hi) (test '#() make-vector 0) (test '#() make-vector 0 'a) @@ -39,6 +47,7 @@ (err/rt-test (make-vector -1 'a)) (err/rt-test (make-vector 1000000000000000000000 'a) exn:fail:out-of-memory?) (arity-test vector-set! 3 3) +(err/rt-test (vector-set*! #() 0 'x 1) exn:fail?) (err/rt-test (vector-set! #() 0 'x) exn:application:mismatch?) (err/rt-test (vector-set! #(1 2 3) -1 'x)) (err/rt-test (vector-set! #(1 2 3) 3 'x) exn:application:mismatch?)