diff --git a/collects/racket/vector.rkt b/collects/racket/vector.rkt index ad9b36f6f1..925748c886 100644 --- a/collects/racket/vector.rkt +++ b/collects/racket/vector.rkt @@ -69,19 +69,14 @@ ;; uses name for error reporting (define (varargs-check f v vs name) (unless (procedure? f) - (raise-type-error name "procedure" 0 f)) - (unless (procedure-arity-includes? f (add1 (length vs))) - (raise-type-error - name - (format "procedure (arity ~a)" (add1 (length vs))) - 0 f)) + (apply raise-type-error name "procedure" 0 f v vs)) (unless (vector? v) - (raise-type-error name "vector" 1 v)) + (apply raise-type-error name "vector" 1 f v vs)) (let ([len (unsafe-vector-length v)]) (for ([e (in-list vs)] [i (in-naturals 2)]) (unless (vector? e) - (raise-type-error name "vector" e i)) + (apply raise-type-error name "vector" e i f v vs)) (unless (= len (unsafe-vector-length e)) (raise (make-exn:fail:contract @@ -96,6 +91,13 @@ (format "given ~a arguments total" (sub1 (length args)))))) (current-continuation-marks))))) + (unless (procedure-arity-includes? f (add1 (length vs))) + (raise-mismatch-error + name + (format + "arity mismatch (expected arity ~a to match number of supplied vectors): " + (add1 (length vs))) + f)) len)) (define (vector-map f v . vs) diff --git a/collects/tests/racket/vector.rktl b/collects/tests/racket/vector.rktl index f5d9766530..945c4c893c 100644 --- a/collects/tests/racket/vector.rktl +++ b/collects/tests/racket/vector.rktl @@ -195,7 +195,6 @@ (err/rt-test (vector-argmax (lambda (x) x) (vector +i)) (check-regs #rx"vector-argmax" #rx"procedure that returns real numbers")) (err/rt-test (vector-argmax (lambda (x) x) (vector)) (check-regs #rx"vector-argmax" #rx"non-empty vector"))) - ;; vector-mem{ber,v,q} (test 0 vector-member 7 #(7 1 2)) @@ -209,6 +208,25 @@ (test #f vector-memv (cons 1 2) (vector 7 (cons 1 2) 2)) (test 1 vector-member (cons 1 2) (vector 7 (cons 1 2) 2)) +;; ---------------------------------------- vector-map + +(let () + + (define ((check-regs . regexps) exn) + (and (exn:fail? exn) + (andmap (λ (reg) (regexp-match reg (exn-message exn))) + regexps))) + (test #(2) vector-map add1 #(1)) + (test #(1 2 3) vector-map (lambda (x y) (max x y)) #(1 -2 -3) #(0 2 3)) + (let ([vec (vector 1 -2 -3)]) + (test #(1 2 3) vector-map! (lambda (x y) (max x y)) vec #(0 2 3)) + (test #(1 2 3) values vec)) + (err/rt-test (vector-map 1 #()) (check-regs #rx"vector-map" #rx"")) + (err/rt-test (vector-map (lambda (x) x) 1) (check-regs #rx"vector-map" #rx"")) + (err/rt-test (vector-map (lambda (x) x) #() 1) (check-regs #rx"vector-map" #rx"")) + (err/rt-test (vector-map (lambda (x) x) #() #(1)) (check-regs #rx"vector-map" #rx"same size")) + (err/rt-test (vector-map (lambda (x) x) #() #() #()) (check-regs #rx"vector-map" #rx"arity mismatch"))) + ;; ---------- check no collisions with srfi/43 ---------- #;(test (void)