This is a special case just to make life more convenient: we know that no matter what boundary 'amount' crosses, it is going to trigger a violation and it will blame that module, so we don't wait.
Robby On Fri, Nov 16, 2012 at 8:24 PM, Harry Spier <vasishtha.sp...@gmail.com> wrote: > Thanks Matthias. > > Why does the first case which doesn't cross a module boundary cause a > contract violation. > > #lang racket > (provide/contract (amount positive?)) > (define amount -7) > > > > On Fri, Nov 16, 2012 at 8:24 PM, Matthias Felleisen <matth...@ccs.neu.edu> > wrote: >> >> >> Contracts really are like business contracts. They are between two >> distinct parties; they are not by a party on itself. >> >> On occasion, you really do want to wish to break the contract inside a >> module. This is well-known in the OO world, and it is often called the >> re-entrance problem. Say you want a balanced tree object. Imagine it has a >> method with a contract that requires 'balanced'ness but is also called >> internally. Perhaps you don't need/wish to balance for internal calls. So >> you do -- and you don't get caught. >> >> Contracts impose a run-time cost. To make the cost reasonable, we trust >> the programmer and we let the programmer know that we trust him. >> >> >> >> >> >> >> >> >> >> On Nov 16, 2012, at 7:52 PM, Galler wrote: >> >> >> >> >> Even if you use define/contract, you may violate the contract on >> >> recursive >> > calls. This is intentional. >> >> >> > >> > Thanks. >> > >> > I hadn't run into that behavior before and wasn't aware. >> > >> > Could you possibly elaborate on the thinking wrt this design choice? >> > >> > (define/contract (my-natural-number n) >> > (-> exact-positive-integer? any/c) >> > (print n) (newline) >> > (my-natural-number (sub1 n))) >> > >> > (my-natural-number 1) >> > 1 >> > 0 >> > -1 >> > -2 >> > -3 >> > -4 >> > >> > >> > >> > ____________________ >> > Racket Users list: >> > http://lists.racket-lang.org/users >> >> >> ____________________ >> Racket Users list: >> http://lists.racket-lang.org/users >> > > > ____________________ > Racket Users list: > http://lists.racket-lang.org/users > ____________________ Racket Users list: http://lists.racket-lang.org/users