Hi Matthias Thanks for the explanation - it helps. I played with the kind of post-condition "broken contract" example that you gave, and find it less problematic, since the blame is local to the function / supplier.
If the error in my original example was reformatted by moving the at clause to the top (easy?) and supplemented with the line number of the guilty client [or supplier] code (hard?) I think it would reduce the confusion and improve the utility. I.e. twice: contract violation at: .../blame-test.rkt - line 2, column 18 expected: number? given: 'foo in: the 1st argument of (-> number? number?) contract from: (function twice) blaming: .../blame-test.rkt - line 6, column 1 What do you think? Kind regards Dan On Mon, Sep 2, 2013 at 11:48 PM, Matthias Felleisen <matth...@ccs.neu.edu>wrote: > > On Sep 2, 2013, at 8:22 AM, Daniel Prager wrote: > > Consider this file: > > -------------------------------------------- > #lang racket > (define/contract (twice x) > (-> number? number?) > (* 2 x)) > > (twice 'foo) > -------------------------------------------- > > When run in DrRacket 5.3.6 this yields the following error: > > twice: contract violation > expected: number? > given: 'foo > in: the 1st argument of > (-> number? number?) > contract from: (function twice) > blaming: .../blame-test.rkt > at: .../blame-test.rkt: 2.18 > > > The final line attributes blame to the twice function (line 2, col 18), > but clearly the blame in this instance lies with the client code (line 6), > consistent with the first six lines of the error message. > > > This is a misinterpretation of the last line. If you read the entire > message as a sentence, you will see that the "at: ..." means "this is where > you find the contract that was broken". The "expected:"/"given" pairing > means that the function was called, it expected a number, and the caller > applied it to the symbol 'foo instead. > > If you run this program > > #lang racket > (define/contract (twice x) > (-> number? number?) > 'foo) > > (twice 2) > > the error message will say > > twice: broke its contract > promised: number? > produced: 'foo > in: the range of > (-> number? number?) > contract from: (function twice) > blaming: (function twice) > at: unsaved-editor665:2.18 > > meaning that foo was called, it promised to return a number, but it > produced the symbol 'foo instead. > > ;; --- > > I will admit that you're not the first one who has tripped over this error > message [format] and that you aren't the last one. But changing it isn't > easy and adding information isn't easy. The problem is that we wish to keep > the messages uniform across all functions but not all functions can benefit > from the actual contract system. > > -- Matthias >
____________________ Racket Users list: http://lists.racket-lang.org/users