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

Reply via email to