<div>Thanks Matthias.<br></div><div><br></div><div>Why does the first case which doesn&#39;t cross a module boundary cause a contract violation.</div><div><br></div><div>#lang racket<br>(provide/contract (amount positive?))<br>
(define amount -7)<br><br></div><div><br></div><br><div class="gmail_quote">On Fri, Nov 16, 2012 at 8:24 PM, Matthias Felleisen <span dir="ltr">&lt;<a href="mailto:matthias@ccs.neu.edu" target="_blank">matthias@ccs.neu.edu</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
Contracts really are like business contracts. They are between two distinct parties; they are not by a party on itself.<br>
<br>
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 &#39;balanced&#39;ness but is also called internally. Perhaps you don&#39;t need/wish to balance for internal calls. So you do -- and you don&#39;t get caught.<br>

<br>
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.<br>
<div class="HOEnZb"><div class="h5"><br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
On Nov 16, 2012, at 7:52 PM, Galler wrote:<br>
<br>
&gt;&gt;<br>
&gt;&gt; Even if you use define/contract, you may violate the contract on recursive<br>
&gt; calls. This is intentional.<br>
&gt;&gt;<br>
&gt;<br>
&gt; Thanks.<br>
&gt;<br>
&gt; I hadn&#39;t run into that behavior before and wasn&#39;t aware.<br>
&gt;<br>
&gt; Could you possibly elaborate on the thinking wrt this design choice?<br>
&gt;<br>
&gt; (define/contract (my-natural-number n)<br>
&gt;  (-&gt; exact-positive-integer? any/c)<br>
&gt;  (print n) (newline)<br>
&gt;  (my-natural-number (sub1 n)))<br>
&gt;<br>
&gt; (my-natural-number 1)<br>
&gt; 1<br>
&gt; 0<br>
&gt; -1<br>
&gt; -2<br>
&gt; -3<br>
&gt; -4<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; ____________________<br>
&gt;  Racket Users list:<br>
&gt;  <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
<br>
</div></div><br>____________________<br>
  Racket Users list:<br>
  <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
<br></blockquote></div><br>