make opt/c contract follow the blame-add-context protocol

This commit is contained in:
Robby Findler 2013-04-26 19:11:34 -05:00
parent 917ec51eee
commit 2e195935cf
5 changed files with 461 additions and 432 deletions

View File

@ -50,7 +50,12 @@
contract-projection
contract-name
n->th)
n->th
blame-add-or-context
blame-add-car-context
blame-add-cdr-context
raise-not-cons-blame-error)
(define-syntax (flat-rec-contract stx)
(syntax-case stx ()
@ -152,12 +157,15 @@
[pred (single-or/c-pred ctc)])
(λ (blame)
(define partial-contract
(c-proc (blame-add-context blame "a disjunct of")))
(c-proc (blame-add-or-context blame)))
(λ (val)
(cond
[(pred val) val]
[else (partial-contract val)])))))
(define (blame-add-or-context blame)
(blame-add-context blame "a disjunct of"))
(define (single-or/c-first-order ctc)
(let ([pred (single-or/c-pred ctc)]
[ho (contract-first-order (single-or/c-ho-ctc ctc))])
@ -629,6 +637,9 @@
(define non-empty-listof-func (*-listof non-empty-list? non-empty-listof (λ (ctc) (make-generate-ctc-fail))))
(define/subexpression-pos-prop (non-empty-listof a) (non-empty-listof-func a))
(define (blame-add-car-context blame) (blame-add-context blame "the car of"))
(define (blame-add-cdr-context blame) (blame-add-context blame "the cdr of"))
(define cons/c-main-function
(λ (car-c cdr-c)
(let* ([ctc-car (coerce-contract 'cons/c car-c)]
@ -641,13 +652,11 @@
(contract-first-order-passes? ctc-car (car v))
(contract-first-order-passes? ctc-cdr (cdr v))))
(define ((ho-check combine) blame)
(let ([car-p (car-proj (blame-add-context blame "the car of"))]
[cdr-p (cdr-proj (blame-add-context blame "the cdr of"))])
(let ([car-p (car-proj (blame-add-car-context blame))]
[cdr-p (cdr-proj (blame-add-cdr-context blame))])
(λ (v)
(unless (pair? v)
(raise-blame-error blame v
'(expected "<pair?>" given: "~e")
v))
(raise-not-cons-blame-error blame v))
(combine v (car-p (car v)) (cdr-p (cdr v))))))
(cond
[(and (flat-contract? ctc-car) (flat-contract? ctc-cdr))
@ -666,6 +675,13 @@
#:first-order fo-check
#:projection (ho-check (λ (v a d) (cons a d))))]))))
(define (raise-not-cons-blame-error blame val)
(raise-blame-error
blame
val
'(expected: "pair?" given: "~e")
val))
(define/subexpression-pos-prop (cons/c a b) (cons/c-main-function a b))
(define/subexpression-pos-prop (list/c . args)

View File

@ -20,6 +20,7 @@
opt/info-that
opt/info-swap-blame
opt/info-add-blame-context
opt/info-change-val
opt/unknown
@ -147,12 +148,12 @@
;; struct for color-keeping across opters
(define-struct opt/info
(contract val blame-id swap-blame? free-vars recf base-pred this that))
(contract val blame-stx swap-blame? free-vars recf base-pred this that))
(define (opt/info-blame oi)
(if (opt/info-swap-blame? oi)
#`(blame-swap #,(opt/info-blame-id oi))
(opt/info-blame-id oi)))
#`(blame-swap #,(opt/info-blame-stx oi))
(opt/info-blame-stx oi)))
;; opt/info-swap-blame : opt/info -> opt/info
;; swaps pos and neg
@ -165,6 +166,14 @@
(struct-copy opt/info info [val val]))
;; opt/info-add-blame-context : opt/info (stx -> stx) -> opt/info
;; calls 'f' on the current blame syntax to build a new one
;; (presumably wrapping it with a call to (blame-add-context ...),
;; possibly via a helper function) and returns an adjusted opt/info record
(define (opt/info-add-blame-context info f)
(struct-copy opt/info info
[blame-stx (f (opt/info-blame-stx info))]))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; stronger helper functions

View File

@ -59,7 +59,11 @@
no-negative-blame
(reverse names))]
[else
(define ps-optres (opt/i opt/info (car ps)))
(define ps-optres (opt/i (opt/info-add-blame-context
opt/info
(λ (blame-stx)
#`(blame-add-or-context #,blame-stx)))
(car ps)))
(if (optres-flat ps-optres)
(loop (cdr ps)
(cons (optres-flat ps-optres) next-ps)
@ -306,8 +310,16 @@
(define/opter (cons/c opt/i opt/info stx)
(define (opt/cons-ctc hdp tlp)
(define optres-hd (opt/i opt/info hdp))
(define optres-tl (opt/i opt/info tlp))
(define optres-hd (opt/i (opt/info-add-blame-context
opt/info
(λ (stx)
#`(blame-add-car-context #,stx)))
hdp))
(define optres-tl (opt/i (opt/info-add-blame-context
opt/info
(λ (stx)
#`(blame-add-cdr-context #,stx)))
tlp))
(with-syntax ((check (with-syntax ((val (opt/info-val opt/info)))
(syntax (pair? val)))))
(build-optres
@ -320,12 +332,8 @@
(syntax (if check
(cons (let ((val (car val))) next-hdp)
(let ((val (cdr val))) next-tlp))
(raise-blame-error
blame
val
'(expected: "~s" given: "~e")
(contract-name ctc)
val))))
(raise-not-cons-blame-error
blame val))))
#:lifts
(append (optres-lifts optres-hd) (optres-lifts optres-tl))
#:superlifts
@ -352,7 +360,12 @@
[(_ hdp tlp) (opt/cons-ctc #'hdp #'tlp)]))
(define-for-syntax (opt/listof-ctc content non-empty? opt/i opt/info)
(define optres-ele (opt/i opt/info content))
(define optres-ele (opt/i
(opt/info-add-blame-context
opt/info
(λ (blame-stx)
#`(blame-add-element-context #,blame-stx)))
content))
(with-syntax ([check (with-syntax ((val (opt/info-val opt/info)))
(if non-empty?
#'(and (list? val) (pair? val))
@ -400,6 +413,9 @@
'listof)
#,(optres-name optres-ele)))))
(define (blame-add-element-context blame)
(blame-add-context blame "an element of"))
(define/opter (listof opt/i opt/info stx)
(syntax-case stx ()
[(_ content) (opt/listof-ctc #'content #f opt/i opt/info)]))
@ -465,7 +481,8 @@
[partials-doms null]
[stronger-ribs null]
[chaperone? #t]
[dom-names '()])
[dom-names '()]
[arg-num 1])
(cond
[(null? doms) (values (reverse next-doms)
lifts-doms
@ -475,7 +492,11 @@
chaperone?
(reverse dom-names))]
[else
(define optres-dom (opt/i (opt/info-swap-blame opt/info) (car doms)))
(define optres-dom (opt/i (opt/info-add-blame-context
(opt/info-swap-blame opt/info)
(λ (blame-stx)
#`(blame-add-nth-arg-context #,blame-stx #,arg-num)))
(car doms)))
(loop (cdr vars)
(cdr doms)
(cons (with-syntax ((next (optres-exp optres-dom))
@ -488,7 +509,8 @@
(append partials-doms (optres-partials optres-dom))
(append (optres-stronger-ribs optres-dom) stronger-ribs)
(combine-two-chaperone?s chaperone? (optres-chaperone optres-dom))
(cons (optres-name optres-dom) dom-names))]))]
(cons (optres-name optres-dom) dom-names)
(+ arg-num 1))]))]
[(next-rngs lifts-rngs superlifts-rngs partials-rngs stronger-ribs-rng rng-chaperone? rng-names)
(let loop ([vars rng-vars]
[rngs rngs]
@ -508,7 +530,12 @@
chaperone?
(reverse rng-names))]
[else
(define optres-rng (opt/i opt/info (car rngs)))
(define optres-rng (opt/i
(opt/info-add-blame-context
opt/info
(λ (blame-stx)
#`(blame-add-range-context #,blame-stx)))
(car rngs)))
(loop (cdr vars)
(cdr rngs)
(cons (with-syntax ((next (optres-exp optres-rng))
@ -576,7 +603,8 @@
[partials-doms null]
[stronger-ribs null]
[chaperone? #t]
[names '()])
[names '()]
[arg-num 1])
(cond
[(null? doms) (values (reverse next-doms)
lifts-doms
@ -586,7 +614,11 @@
chaperone?
(reverse names))]
[else
(define optres-dom (opt/i (opt/info-swap-blame opt/info) (car doms)))
(define optres-dom (opt/i (opt/info-add-blame-context
(opt/info-swap-blame opt/info)
(λ (blame-stx)
#`(blame-add-nth-arg-context #,blame-stx #,arg-num)))
(car doms)))
(loop (cdr vars)
(cdr doms)
(cons #`(let ([#,(opt/info-val opt/info) #,(car vars)]) #,(optres-exp optres-dom))
@ -596,7 +628,8 @@
(append partials-doms (optres-partials optres-dom))
(append (optres-stronger-ribs optres-dom) stronger-ribs)
(combine-two-chaperone?s chaperone? (optres-chaperone optres-dom))
(cons (optres-name optres-dom) names))]))])
(cons (optres-name optres-dom) names)
(+ arg-num 1))]))])
(values
(with-syntax ((blame (opt/info-blame opt/info))
((dom-arg ...) dom-vars)
@ -676,6 +709,13 @@
#:name name)
(opt/unknown opt/i opt/info stx))))]))
(define (blame-add-nth-arg-context blame n)
(blame-add-context blame
(format "the ~a argument of" (n->th n))))
(define (blame-add-range-context blame)
(blame-add-context blame
"the range of"))
(define/opter (predicate/c opt/i opt/info stx) (predicate/c-optres opt/info))
(define (handle-non-exact-procedure val dom-len blame exact-proc)

View File

@ -888,7 +888,12 @@
(define sub-val (car (generate-temporaries '(struct/dc))))
(define this-optres (opt/i (opt/info-change-val sub-val opt/info) exp))
(define this-optres (opt/i
(opt/info-add-blame-context
(opt/info-change-val sub-val opt/info)
(λ (blame-stx)
#`(blame-add-struct-context #,blame-stx '#,sel-name)))
exp))
(define sel-id (name->sel-id #'struct-id sel-name))
@ -1012,6 +1017,9 @@
#:chaperone #t
#:no-negative-blame? no-negative-blame))]))]))
(define (blame-add-struct-context blame fld)
(blame-add-context blame (format "the ~a field of" fld)))
(define (struct/dc-error blame obj what)
(raise-blame-error blame obj
'(expected: "a struct of type ~a")

View File

@ -13378,414 +13378,370 @@ so that propagation occurs.
(string-append "did not find ``in:'', so no context in msg: "
str)])))
(ctest '("the cdr of" "the 1st argument of")
extract-context-lines
(λ () ((contract (-> (cons/c integer? boolean?) integer? integer?)
(λ (x y) x)
'pos
'neg)
(cons 1 2) 1)))
(ctest '("the 3rd element of" "the 2nd argument of")
extract-context-lines
(λ () ((contract (-> integer? (list/c integer? integer? boolean?) integer?)
(λ (x y) x)
'pos
'neg)
1 (list 1 2 3))))
(ctest '("the range of" "the 4th element of")
extract-context-lines
(λ () ((cadddr (contract (list/c integer? integer? boolean? (-> number? number?))
(list 1 2 #f (λ (x) #f))
(define (context-test context expression)
(contract-eval `(,test ',context extract-context-lines (lambda () ,expression)))
(let/ec k
(contract-eval `(,test ',context extract-context-lines (lambda () ,(rewrite expression k))))))
(context-test '("the 1st argument of")
'((contract (-> boolean? integer? integer?)
(λ (x y) x)
'pos
'neg)
0 1))
(context-test '("the cdr of" "the 1st argument of")
'((contract (-> (cons/c integer? boolean?) integer? integer?)
(λ (x y) x)
'pos
'neg)
(cons 1 2) 1))
(context-test '("the 3rd element of" "the 2nd argument of")
'((contract (-> integer? (list/c integer? integer? boolean?) integer?)
(λ (x y) x)
'pos
'neg)
1 (list 1 2 3)))
(context-test '("the range of" "the 4th element of")
'((cadddr (contract (list/c integer? integer? boolean? (-> number? number?))
(list 1 2 #f (λ (x) #f))
'pos
'neg))
1))
(context-test '("a disjunct of")
'(contract (or/c 1 (-> number? number?))
3
'pos
'neg))
(context-test '("the range of" "a disjunct of")
'((contract (or/c 1 (-> number? number?) (-> number? boolean? number?))
(λ (x) #f)
'pos
'neg)
1))
(context-test '("the 2nd conjunct of")
'(contract (and/c procedure? (-> integer? integer?))
(λ (x y) 1)
'pos
'neg))
(context-test '("an element of")
'(contract (listof number?)
(list #f)
'pos
'neg))
(context-test '("the promise from")
'(force (contract (promise/c number?)
(delay #f)
'pos
'neg))
1)))
(ctest '("a disjunct of")
extract-context-lines
(λ () (contract (or/c 1 (-> number? number?))
3
'pos
'neg)))
(ctest '("the range of" "a disjunct of")
extract-context-lines
(λ () ((contract (or/c 1 (-> number? number?) (-> number? boolean? number?))
(λ (x) #f)
'pos
'neg)
1)))
(ctest '("the 2nd conjunct of")
extract-context-lines
(λ () (contract (and/c procedure? (-> integer? integer?))
(λ (x y) 1)
'pos
'neg)))
(ctest '("an element of")
extract-context-lines
(λ () (contract (listof number?)
(list #f)
'pos
'neg)))
(ctest '("the promise from")
extract-context-lines
(λ () (force (contract (promise/c number?)
(delay #f)
'pos
'neg))))
(ctest '("the parameter of")
extract-context-lines
(λ () ((contract (parameter/c number?)
(make-parameter #f)
'pos
'neg))))
(ctest '("the parameter of")
extract-context-lines
(λ () ((contract (parameter/c number?)
(make-parameter 1)
'pos
'neg)
#f)))
(ctest '("the #:x argument of")
extract-context-lines
(λ () ((contract (-> #:x number? #:a char? #:w boolean? any)
(λ (#:x x #:a a #:w w) x)
'pos
'neg)
#:a #\a #:w #f #:x 'two)))
(ctest '("the #:a argument of")
extract-context-lines
(λ () ((contract (-> #:x number? #:a char? #:w boolean? any)
(λ (#:x x #:a a #:w w) x)
'pos
'neg)
#:a #f #:w #f #:x 2)))
(ctest '("the #:w argument of")
extract-context-lines
(λ () ((contract (-> #:x number? #:a char? #:w boolean? any)
(λ (#:x x #:a a #:w w) x)
'pos
'neg)
#:a #\a #:w 'false #:x 2)))
(ctest '("the #:x argument of")
extract-context-lines
(λ () ((contract (->* () (#:x number?) any)
(λ (#:x [x 1]) x)
'pos
'neg)
#:x #f)))
(ctest '("the #:x argument of")
extract-context-lines
(λ () ((contract (->* () (#:x number? #:a char? #:w boolean?) any)
(λ (#:x [x 1] #:a [a #\a] #:w [w #f]) x)
'pos
'neg)
#:a #\a #:w #f #:x 'two)))
(ctest '("the #:a argument of")
extract-context-lines
(λ () ((contract (->* () (#:x number? #:a char? #:w boolean?) any)
(λ (#:x [x 1] #:a [a #\a] #:w [w #f]) x)
'pos
'neg)
#:a #f #:w #f #:x 2)))
(ctest '("the #:w argument of")
extract-context-lines
(λ () ((contract (->* () (#:x number? #:a char? #:w boolean?) any)
(λ (#:x [x 1] #:a [a #\a] #:w [w #f]) x)
'pos
'neg)
#:a #\a #:w 'false #:x 2)))
(ctest '("the x argument of")
extract-context-lines
(λ () ((contract (->i ([w integer?] [x boolean?] [a char?]) any)
(λ (w x a) x)
'pos
'neg)
1 'true #\a)))
(ctest '("the x argument of")
extract-context-lines
(λ () ((contract (->i ([w integer?]) ([x boolean?] [a char?]) any)
(λ (w [x #t] [a #\a]) x)
'pos
'neg)
1 'true #\a)))
(ctest '("the y result of")
extract-context-lines
(λ () ((contract (->i () (values [x integer?] [y integer?]))
(λ () (values 1 #f))
'pos
'neg))))
(ctest '("the x result of")
extract-context-lines
(λ () ((contract (->i () (values [x integer?] [y integer?]))
(λ () (values #f 1))
'pos
'neg))))
(ctest '("the _ result of")
extract-context-lines
(λ () ((contract (->i ([x integer?]) [_ (x) (<=/c x)])
add1
'pos
'neg)
1)))
(ctest '("the a argument of")
extract-context-lines
(λ () ((contract (->i ([a integer?] #:b [b integer?]) ([c integer?] #:d [d integer?]) any)
(λ (a #:b b [c 1] #:d [d 1]) 1)
'pos
'neg)
'one #:b 2 3 #:d 4)))
(ctest '("the b argument of")
extract-context-lines
(λ () ((contract (->i ([a integer?] #:b [b integer?]) ([c integer?] #:d [d integer?]) any)
(λ (a #:b b [c 1] #:d [d 1]) 1)
'pos
'neg)
1 #:b 'two 3 #:d 4)))
(ctest '("the c argument of")
extract-context-lines
(λ () ((contract (->i ([a integer?] #:b [b integer?]) ([c integer?] #:d [d integer?]) any)
(λ (a #:b b [c 1] #:d [d 1]) 1)
'pos
'neg)
1 #:b 2 'three #:d 4)))
(ctest '("the d argument of")
extract-context-lines
(λ () ((contract (->i ([a integer?] #:b [b integer?]) ([c integer?] #:d [d integer?]) any)
(λ (a #:b b [c 1] #:d [d 1]) 1)
'pos
'neg)
1 #:b 2 3 #:d 'four)))
'neg)))
(context-test '("the parameter of")
'((contract (parameter/c number?)
(make-parameter #f)
'pos
'neg)))
(context-test '("the parameter of")
'((contract (parameter/c number?)
(make-parameter 1)
'pos
'neg)
#f))
(context-test '("the #:x argument of")
'((contract (-> #:x number? #:a char? #:w boolean? any)
(λ (#:x x #:a a #:w w) x)
'pos
'neg)
#:a #\a #:w #f #:x 'two))
(context-test '("the #:a argument of")
'((contract (-> #:x number? #:a char? #:w boolean? any)
(λ (#:x x #:a a #:w w) x)
'pos
'neg)
#:a #f #:w #f #:x 2))
(context-test '("the #:w argument of")
'((contract (-> #:x number? #:a char? #:w boolean? any)
(λ (#:x x #:a a #:w w) x)
'pos
'neg)
#:a #\a #:w 'false #:x 2))
(context-test '("the #:x argument of")
'((contract (->* () (#:x number?) any)
(λ (#:x [x 1]) x)
'pos
'neg)
#:x #f))
(context-test '("the #:x argument of")
'((contract (->* () (#:x number? #:a char? #:w boolean?) any)
(λ (#:x [x 1] #:a [a #\a] #:w [w #f]) x)
'pos
'neg)
#:a #\a #:w #f #:x 'two))
(context-test '("the #:a argument of")
'((contract (->* () (#:x number? #:a char? #:w boolean?) any)
(λ (#:x [x 1] #:a [a #\a] #:w [w #f]) x)
'pos
'neg)
#:a #f #:w #f #:x 2))
(context-test '("the #:w argument of")
'((contract (->* () (#:x number? #:a char? #:w boolean?) any)
(λ (#:x [x 1] #:a [a #\a] #:w [w #f]) x)
'pos
'neg)
#:a #\a #:w 'false #:x 2))
(context-test '("the x argument of")
'((contract (->i ([w integer?] [x boolean?] [a char?]) any)
(λ (w x a) x)
'pos
'neg)
1 'true #\a))
(context-test '("the x argument of")
'((contract (->i ([w integer?]) ([x boolean?] [a char?]) any)
(λ (w [x #t] [a #\a]) x)
'pos
'neg)
1 'true #\a))
(context-test '("the y result of")
'((contract (->i () (values [x integer?] [y integer?]))
(λ () (values 1 #f))
'pos
'neg)))
(context-test '("the x result of")
'((contract (->i () (values [x integer?] [y integer?]))
(λ () (values #f 1))
'pos
'neg)))
(context-test '("the _ result of")
'((contract (->i ([x integer?]) [_ (x) (<=/c x)])
add1
'pos
'neg)
1))
(context-test '("the a argument of")
'((contract (->i ([a integer?] #:b [b integer?]) ([c integer?] #:d [d integer?]) any)
(λ (a #:b b [c 1] #:d [d 1]) 1)
'pos
'neg)
'one #:b 2 3 #:d 4))
(context-test '("the b argument of")
'((contract (->i ([a integer?] #:b [b integer?]) ([c integer?] #:d [d integer?]) any)
(λ (a #:b b [c 1] #:d [d 1]) 1)
'pos
'neg)
1 #:b 'two 3 #:d 4))
(context-test '("the c argument of")
'((contract (->i ([a integer?] #:b [b integer?]) ([c integer?] #:d [d integer?]) any)
(λ (a #:b b [c 1] #:d [d 1]) 1)
'pos
'neg)
1 #:b 2 'three #:d 4))
(context-test '("the d argument of")
'((contract (->i ([a integer?] #:b [b integer?]) ([c integer?] #:d [d integer?]) any)
(λ (a #:b b [c 1] #:d [d 1]) 1)
'pos
'neg)
1 #:b 2 3 #:d 'four))
;; indy
(ctest '("the 2nd argument of" "the x argument of")
extract-context-lines
(λ () ((contract (->i ([x (-> number? boolean? integer?)] [a (x) (>=/c (x 11 'true))]) any)
(λ (x a) x)
'pos
'neg)
(λ (x y) 1) 11)))
(ctest '("the 2nd argument of" "the x result of")
extract-context-lines
(λ () ((contract (->i () (values [x (-> number? boolean? integer?)] [a (x) (>=/c (x 11 'true))]))
(λ () (values (λ (x y) x) 1))
'pos
'neg))))
(ctest '("the x argument of")
extract-context-lines
(λ () ((contract (->i ([x () integer?]) any)
(λ (x) x)
'pos
'neg)
#f)))
(ctest '("the a argument of")
extract-context-lines
(λ () ((contract (->i ([a integer?] [x (a) integer?]) any)
(λ (a x) x)
'pos
'neg)
#f 1)))
(ctest '("the 1st result of")
extract-context-lines
(λ () ((contract (->i () (values [_ integer?] [_ integer?]))
(λ () (values #f 1))
'pos
'neg))))
(ctest '("the result of")
extract-context-lines
(λ () ((contract (->i () [_ integer?])
(λ () (values #f))
'pos
'neg))))
(ctest '("the domain of")
extract-context-lines
(λ () ((contract (->d ([x integer?]) [y integer?])
(λ (x) #f)
'pos
'neg)
#f)))
(ctest '("the range of")
extract-context-lines
(λ () ((contract (->d ([x integer?]) [y integer?])
(λ (x) #f)
'pos
'neg)
1)))
(ctest '("the range of")
extract-context-lines
(λ () (letrec ([ctc (-> integer? (recursive-contract ctc))])
(letrec ([f (λ (x) 'not-f)])
((contract ctc f 'pos 'neg) 1)))))
(ctest '("the a field of")
extract-context-lines
(λ ()
(struct s (a b))
(contract (struct/dc s [a (b) (<=/c b)] [b integer?])
(s 2 1)
'pos
'neg)))
(ctest '("the a field of")
extract-context-lines
(λ ()
(struct s (a b))
(contract (struct/dc s [a (<=/c 1)] [b integer?])
(s 2 1)
'pos
'neg)))
(ctest '("an element of" "the 2nd element of")
extract-context-lines
(λ () (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)))
(ctest '("the keys of")
extract-context-lines
(λ () (contract (hash/c integer? (-> integer? integer?))
(hash #f (λ (x) #f))
'pos
'neg)))
(ctest '("the range of" "the values of")
extract-context-lines
(λ () ((hash-ref
(contract (hash/c integer? (-> integer? integer?))
(hash 0 (λ (x) #f))
'pos
'neg)
0)
1)))
(ctest '("an element of" "the rest argument of")
extract-context-lines
(λ ()
((contract (->* () #:rest (listof number?) number?)
+
'pos 'neg)
1 "a")))
(ctest '("the 2nd argument of")
extract-context-lines
(λ ()
((contract (->* (number? number?) #:rest (listof number?) number?)
+
'pos 'neg)
1 "a")))
(ctest '("an element of" "the rest argument of")
extract-context-lines
(λ ()
((contract (->* (number?) #:rest (listof number?) number?)
+
'pos 'neg)
1 "a")))
(context-test '("the 2nd argument of" "the x argument of")
'((contract (->i ([x (-> number? boolean? integer?)] [a (x) (>=/c (x 11 'true))]) any)
(λ (x a) x)
'pos
'neg)
(λ (x y) 1) 11))
(ctest '("the range of" "the 2nd case of")
extract-context-lines
(λ ()
((contract (case-> (-> real? real? real?)
(-> real? (values real? real?)))
(case-lambda
[(x y) 1]
[(x) 1])
'pos 'neg)
1)))
(context-test '("the 2nd argument of" "the x result of")
'((contract (->i () (values [x (-> number? boolean? integer?)] [a (x) (>=/c (x 11 'true))]))
(λ () (values (λ (x y) x) 1))
'pos
'neg)))
(context-test '("the x argument of")
'((contract (->i ([x () integer?]) any)
(λ (x) x)
'pos
'neg)
#f))
(context-test '("the a argument of")
'((contract (->i ([a integer?] [x (a) integer?]) any)
(λ (a x) x)
'pos
'neg)
#f 1))
(context-test '("the 1st result of")
'((contract (->i () (values [_ integer?] [_ integer?]))
(λ () (values #f 1))
'pos
'neg)))
(context-test '("the result of")
'((contract (->i () [_ integer?])
(λ () (values #f))
'pos
'neg)))
(context-test '("the domain of")
'((contract (->d ([x integer?]) [y integer?])
(λ (x) #f)
'pos
'neg)
#f))
(context-test '("the range of")
'((contract (->d ([x integer?]) [y integer?])
(λ (x) #f)
'pos
'neg)
1))
(context-test '("the range of")
'(letrec ([ctc (-> integer? (recursive-contract ctc))])
(letrec ([f (λ (x) 'not-f)])
((contract ctc f 'pos 'neg) 1))))
(context-test '("the a field of")
'(let ()
(struct s (a b))
(contract (struct/dc s [a (b) (<=/c b)] [b integer?])
(s 2 1)
'pos
'neg)))
(context-test '("the a field of")
'(let ()
(struct s (a b))
(contract (struct/dc s [a (<=/c 1)] [b integer?])
(s 2 1)
'pos
'neg)))
(context-test '("an element of" "the 2nd element of")
'(vector-ref
(vector-ref
(contract (vector/c (vectorof real?) (vectorof number?) (vectorof boolean?))
(vector (vector 1) (vector 1) (vector 1))
'pos
'neg)
2)
0))
(context-test '("the 0th element of")
'(vector-ref (contract (vector/c integer?)
(vector #f)
'pos
'neg)
0))
(context-test '("the 0th element of")
'(vector-ref (contract (vector/c (-> integer? integer?))
(vector #f)
'pos
'neg)
0))
(context-test '("the 0th element of")
'(vector-ref (contract (vector/c (new-∀/c 'α))
(vector #f)
'pos
'neg)
0))
(context-test '("an element of")
'(vector-ref
(contract (vectorof integer?)
(vector #f)
'pos
'neg)
0))
(context-test '("an element of")
'(vector-ref (contract (vectorof (-> integer? integer?))
(vector #f)
'pos
'neg)
0))
(context-test '("an element of")
'(vector-ref (contract (vectorof (new-∀/c 'α))
(vector #f)
'pos
'neg)
0))
(context-test '("the keys of")
'(contract (hash/c integer? (-> integer? integer?))
(hash #f (λ (x) #f))
'pos
'neg))
(context-test '("the range of" "the values of")
'((hash-ref
(contract (hash/c integer? (-> integer? integer?))
(hash 0 (λ (x) #f))
'pos
'neg)
0)
1))
(context-test '("an element of" "the rest argument of")
'((contract (->* () #:rest (listof number?) number?)
+
'pos 'neg)
1 "a"))
(context-test '("the 2nd argument of")
'((contract (->* (number? number?) #:rest (listof number?) number?)
+
'pos 'neg)
1 "a"))
(context-test '("an element of" "the rest argument of")
'((contract (->* (number?) #:rest (listof number?) number?)
+
'pos 'neg)
1 "a"))
(context-test '("the range of" "the 2nd case of")
'((contract (case-> (-> real? real? real?)
(-> real? (values real? real?)))
(case-lambda
[(x y) 1]
[(x) 1])
'pos 'neg)
1))
(context-test '("the domain of" "the 2nd case of")
'((contract (case-> (-> real? real? real?)
(-> real? (values real? real?)))
(case-lambda
[(x y) 1]
[(x) 1])
'pos 'neg)
#f))
(ctest '("the domain of" "the 2nd case of")
extract-context-lines
(λ ()
((contract (case-> (-> real? real? real?)
(-> real? (values real? real?)))
(case-lambda
[(x y) 1]
[(x) 1])
'pos 'neg)
#f)))
(let* ([blame-pos (contract-eval '(make-blame (srcloc #f #f #f #f #f) #f (λ () 'integer?) 'positive 'negative #t))]
[blame-neg (contract-eval `(blame-swap ,blame-pos))])