These contracts are not thrown &quot;at dynamic places&quot;. The contract is always at the module boundary/etc, but its meaning if affected by the dynamic context of the particular boundary crossing. [1]<div><br></div><div>
I&#39;m been thinking about why I want to use contracts for this purpose.</div><div><br></div><div>The alternative is to put an any/c contract in all the places I currently have response/c and as the first thing in all those functions call current-any-&gt;response [or as the last thing on returns] on the input argument. I would then have to put a note in all the documentation of those any/c that it doesn&#39;t REALLY accept anything, instead in other accepts things that the dynamic current-any-&gt;response will turn into a response. If the coercion failed, then I would have to throw an error, which be purely dynamic with no blame information because it would not be associated with a contract boundary.</div>
<div><br></div><div>In contrast, using a contract for this purpose allows me to centralize the documentation and behavior of these arguments, get correct blame on places where the coercion fails, and abstract the coercion out of the code that is using it into its interface. These are all great wins.</div>
<div><br></div><div>In my opinion, if I did not use contracts, the only elegant thing to do would be to recreate something almost exactly like the contract system but called the coercion system. That is absurd to me when contracts already do exactly this.</div>
<div><br></div><div>Am I just not clever enough to think of another elegant way?</div><div><br></div><div>Why is there so much resistance to using the contract system in a perfectly legal way according to its own definition &amp; contracts? [2] [i.e. &quot;projection&quot; functions are not forced to be projections by any means. / contracts already break eq?/equal?-ness / etc]</div>
<div><br></div><div>Jay</div><div><br></div><div>1. We already have such context-sensitive contracts:</div><div><br></div><div><a href="http://docs.racket-lang.org/xml/index.html#(def._((lib._xml/main..rkt)._permissive/c))">http://docs.racket-lang.org/xml/index.html#(def._((lib._xml/main..rkt)._permissive/c))</a></div>
<div><br></div><div>permissive/c exists to allow DrRacket to embed more snips inside the XML boxes, which are otherwise not XML elements.</div><div><br></div><div>2. make-contract&#39;s projection keyword has the contract (-&gt; any/c any/c)</div>
<div><br></div><div>The example of make-contract coerces the procedure by restricting how many arguments rather than checking that when it is given that number of arguments it is used properly, etc.</div><div><br></div><div>
Only flat and chaperone contracts attempt to enforce projection-ness.</div><div><br><div class="gmail_quote">On Sun, Dec 5, 2010 at 9:31 AM, Matthias Felleisen <span dir="ltr">&lt;<a href="mailto:matthias@ccs.neu.edu">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>
Jay, coercions aka casts in our world are compound words with -&gt; in between them. Why do you need a new name?<br>
<br>
(There is an inconsistency in their behavior. To wit<br>
<br>
Welcome to Racket v5.0.99.4.<br>
&gt; (integer-&gt;char 1000000000000000)<br>
integer-&gt;char: expects argument of type &lt;exact integer in [0,#x10FFFF], not in [#xD800,#xDFFF]&gt;; given 1000000000000000<br>
<br>
 === context ===<br>
/Users/matthias/plt/collects/racket/private/misc.rkt:78:7<br>
&gt; (string-&gt;number &quot;a10&quot;)<br>
#f<br>
<br>
But that is a historical problem.)<br>
<br>
;; ---<br>
<br>
I am also reluctant to throw contracts at dynamic places. Contract boundaries should be syntactically distinct, e.g., module boundaries or define/contract.<br>
<br>
;; ---<br>
<br>
I think you&#39;re really just checking an assertion. So perhaps you want to go with /a as a suffix.<br>
<font color="#888888"><br>
<br>
-- Matthias<br>
<br>
<br>
</font></blockquote></div><br><br clear="all"><br>-- <br>Jay McCarthy &lt;<a href="mailto:jay@cs.byu.edu" target="_blank">jay@cs.byu.edu</a>&gt;<br>Assistant Professor / Brigham Young University<br><a href="http://faculty.cs.byu.edu/~jay" target="_blank">http://faculty.cs.byu.edu/~jay</a><br>
<br>&quot;The glory of God is Intelligence&quot; - D&amp;C 93<br>
</div>