added blame context information to vector/c and vectorof contracts
This commit is contained in:
parent
f5e3182345
commit
dfad46cd7a
|
@ -96,8 +96,8 @@
|
|||
[immutable (base-vectorof-immutable ctc)]
|
||||
[check (check-vectorof ctc)])
|
||||
(λ (blame)
|
||||
(let ([elem-pos-proj ((contract-projection elem-ctc) blame)]
|
||||
[elem-neg-proj ((contract-projection elem-ctc) (blame-swap blame))])
|
||||
(let ([elem-pos-proj ((contract-projection elem-ctc) (blame-add-context blame "an element of"))]
|
||||
[elem-neg-proj ((contract-projection elem-ctc) (blame-add-context blame "an element of" #:swap? #t))])
|
||||
(define checked-ref (λ (vec i val) (elem-pos-proj val)))
|
||||
(define checked-set (λ (vec i val) (elem-neg-proj val)))
|
||||
(define raise-blame (λ (val . args)
|
||||
|
@ -229,11 +229,12 @@
|
|||
#:projection
|
||||
(λ (ctc)
|
||||
(λ (blame)
|
||||
(define blame+ctxt (blame-add-context blame "an element of"))
|
||||
(λ (val)
|
||||
(check-vector/c ctc val blame)
|
||||
(for ([e (in-vector val)]
|
||||
[c (in-list (base-vector/c-elems ctc))])
|
||||
(((contract-projection c) blame) e))
|
||||
(((contract-projection c) blame+ctxt) e))
|
||||
val)))))
|
||||
|
||||
(define (vector/c-ho-projection vector-wrapper)
|
||||
|
@ -241,10 +242,16 @@
|
|||
(let ([elem-ctcs (base-vector/c-elems ctc)]
|
||||
[immutable (base-vector/c-immutable ctc)])
|
||||
(λ (blame)
|
||||
(let ([elem-pos-projs (apply vector-immutable
|
||||
(map (λ (c) ((contract-projection c) blame)) elem-ctcs))]
|
||||
[elem-neg-projs (apply vector-immutable
|
||||
(map (λ (c) ((contract-projection c) (blame-swap blame))) elem-ctcs))])
|
||||
(let ([elem-pos-projs (for/vector #:length (length elem-ctcs)
|
||||
([c (in-list elem-ctcs)]
|
||||
[i (in-naturals)])
|
||||
((contract-projection c)
|
||||
(blame-add-context blame (format "the ~a element of" (n->th i)))))]
|
||||
[elem-neg-projs (for/vector #:length (length elem-ctcs)
|
||||
([c (in-list elem-ctcs)]
|
||||
[i (in-naturals)])
|
||||
((contract-projection c)
|
||||
(blame-add-context blame (format "the ~a element of" (n->th i)) #:swap? #t)))])
|
||||
(λ (val)
|
||||
(check-vector/c ctc val blame)
|
||||
(if (immutable? val)
|
||||
|
|
|
@ -12664,13 +12664,65 @@ so that propagation occurs.
|
|||
'pos
|
||||
'neg)))
|
||||
|
||||
#;
|
||||
(ctest '("an element of" "the 3rd element of")
|
||||
(ctest '("an element of" "the 2nd element of")
|
||||
extract-context-lines
|
||||
(λ () (contract (vector/c (vectorof real?) (vectorof number?) (vectorof boolean?))
|
||||
(vector (vector 1) (vector 1) (vector 1))
|
||||
'pos
|
||||
'neg)))
|
||||
(λ () (vector-ref
|
||||
(vector-ref
|
||||
(contract (vector/c (vectorof real?) (vectorof number?) (vectorof boolean?))
|
||||
(vector (vector 1) (vector 1) (vector 1))
|
||||
'pos
|
||||
'neg)
|
||||
2)
|
||||
0)))
|
||||
|
||||
(ctest '("the 0th element of")
|
||||
extract-context-lines
|
||||
(λ () (vector-ref (contract (vector/c integer?)
|
||||
(vector #f)
|
||||
'pos
|
||||
'neg)
|
||||
0)))
|
||||
|
||||
(ctest '("the 0th element of")
|
||||
extract-context-lines
|
||||
(λ () (vector-ref (contract (vector/c (-> integer? integer?))
|
||||
(vector #f)
|
||||
'pos
|
||||
'neg)
|
||||
0)))
|
||||
|
||||
(ctest '("the 0th element of")
|
||||
extract-context-lines
|
||||
(λ () (vector-ref (contract (vector/c (new-∀/c 'α))
|
||||
(vector #f)
|
||||
'pos
|
||||
'neg)
|
||||
0)))
|
||||
|
||||
(ctest '("an element of")
|
||||
extract-context-lines
|
||||
(λ () (vector-ref
|
||||
(contract (vectorof integer?)
|
||||
(vector #f)
|
||||
'pos
|
||||
'neg)
|
||||
0)))
|
||||
|
||||
(ctest '("an element of")
|
||||
extract-context-lines
|
||||
(λ () (vector-ref (contract (vectorof (-> integer? integer?))
|
||||
(vector #f)
|
||||
'pos
|
||||
'neg)
|
||||
0)))
|
||||
|
||||
(ctest '("an element of")
|
||||
extract-context-lines
|
||||
(λ () (vector-ref (contract (vectorof (new-∀/c 'α))
|
||||
(vector #f)
|
||||
'pos
|
||||
'neg)
|
||||
0)))
|
||||
|
||||
;
|
||||
;
|
||||
|
|
Loading…
Reference in New Issue
Block a user