You're right on. Let's see what we can do -- Matthias
On Sep 2, 2013, at 4:57 PM, Daniel Prager wrote: > 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