<div class="gmail_quote">On Mon, Dec 6, 2010 at 10:23 AM, Robby Findler <span dir="ltr">&lt;<a href="mailto:robby@eecs.northwestern.edu">robby@eecs.northwestern.edu</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div class="im">On Mon, Dec 6, 2010 at 11:19 AM, Jay McCarthy &lt;<a href="mailto:jay.mccarthy@gmail.com">jay.mccarthy@gmail.com</a>&gt; wrote:<br>
&gt;<br>
&gt;<br>
&gt; On Mon, Dec 6, 2010 at 10:16 AM, Robby Findler &lt;<a href="mailto:robby@eecs.northwestern.edu">robby@eecs.northwestern.edu</a>&gt;<br>
&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt; Who should be blamed if the coercion does not return a response?<br>
&gt;<br>
&gt; The provider of the coercion should be blamed, but that is not possible [I<br>
&gt; think] so the positive party of the whole dynamic/c is blamed.<br>
<br>
</div>Can you show us an example use of this contract from the web server?<br></blockquote><div><br></div><div>The HEAD Web Server has this definition of response/c:</div><div><br></div><div><div>(define response/c</div>
<div>  (or/c response/basic?</div><div>        (cons/c bytes? (listof (or/c string? bytes?)))</div><div>        pretty-xexpr/c))</div></div><div><br></div><div>My local changes have:</div><div><br></div><div><div>(define current-response/c</div>
<div>  (make-parameter any/c))</div><div>(define response/c</div><div>  (dynamic/c any/c current-response/c response?))</div></div><div><br></div><div>My compatibility library is just a module with this body:</div><div><br>
</div><div>(current-response/c (coerce/c normalize-response))</div><div><br></div><div>where normalize-response is the function (basically) that the old Web Server always used before relying on anything in particular about a response and coerce/c is a trivial thing that turns a coercion into a contract:</div>
<div><br></div><div><div>(define (coerce/c i-&gt;o)</div><div>  (make-contract</div><div>   #:name (build-compound-type-name &#39;coerce i-&gt;o)</div><div>   #:projection</div><div>   (λ (b)</div><div>     (λ (x)</div><div>
       (or (i-&gt;o x)</div><div>           (raise-blame-error b x &quot;Coercion failed&quot;))))))</div></div><div><br></div><div>My local copy will also provide xexpr-response/c:</div><div><br></div><div><div>(define xexpr-response/c</div>
<div>  (coerce/c</div><div>   (λ (x)</div><div>     (cond</div><div>       [(response? x)</div><div>        x]</div><div>       [(xexpr? x)</div><div>        (response/xexpr x)]</div><div>       [else</div><div>        #f]))))</div>
</div><div><br></div><div>which many users will want to use as a current-response/c, although I will not ship any code that uses it exist for test cases.</div><div><br></div><div>Jay</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

<div class="im"><br>
&gt;&gt; Is there a contract on current-response/c? (I assume that the &quot;/c&quot;<br>
&gt;&gt; there is a misnomer and it really is a parameter that holds a<br>
&gt;&gt; contact/coercion, not a contract.)<br>
&gt;<br>
&gt; current-response/c is contracted with (parameter/c contract?)<br>
&gt; The /c is not a misnomer, you are just parsing it wrong. Read it as<br>
&gt; (parameter (contract response)) not (contract (parameter response)), where<br>
&gt; /c is the post-fix syntax for (contract x) and current- is the pre-fix<br>
&gt; syntax for (parameter x)<br>
<br>
</div>Ah. I see.<br>
<font color="#888888"><br>
Robby<br>
</font><div><div></div><div class="h5"><br>
&gt;<br>
&gt;&gt;<br>
&gt;&gt; Robby<br>
&gt;&gt;<br>
&gt;&gt; On Mon, Dec 6, 2010 at 10:55 AM, Jay McCarthy &lt;<a href="mailto:jay.mccarthy@gmail.com">jay.mccarthy@gmail.com</a>&gt;<br>
&gt;&gt; wrote:<br>
&gt;&gt; &gt; Maybe dynamic/c isn&#39;t clear enough... its definition is pretty short:<br>
&gt;&gt; &gt; (define (dynamic/c pre parameter post)<br>
&gt;&gt; &gt;   (define pre-ctc (coerce-contract &#39;pre pre))<br>
&gt;&gt; &gt;   (define post-ctc (coerce-contract &#39;post post))<br>
&gt;&gt; &gt;   (make-contract<br>
&gt;&gt; &gt;    #:name (build-compound-type-name &#39;dynamic pre-ctc parameter post-ctc)<br>
&gt;&gt; &gt;    #:projection<br>
&gt;&gt; &gt;    (λ (b)<br>
&gt;&gt; &gt;      (define pre-proj ((contract-projection pre-ctc) b))<br>
&gt;&gt; &gt;      (define post-proj ((contract-projection post-ctc) b))<br>
&gt;&gt; &gt;      (λ (x)<br>
&gt;&gt; &gt;        (define dyn-proj<br>
&gt;&gt; &gt;          ((contract-projection (coerce-contract &#39;dynamic (parameter)))<br>
&gt;&gt; &gt; b))<br>
&gt;&gt; &gt;        (post-proj<br>
&gt;&gt; &gt;         (dyn-proj<br>
&gt;&gt; &gt;          (pre-proj<br>
&gt;&gt; &gt;           x)))))))<br>
&gt;&gt; &gt; The system provides pre and post, so it can offer protection to the<br>
&gt;&gt; &gt; coercion<br>
&gt;&gt; &gt; as well as receive protection FROM the coercion. But the coercion comes<br>
&gt;&gt; &gt; from<br>
&gt;&gt; &gt; a parameter which is exposed to the user.<br>
&gt;&gt; &gt; The one I use in the web-server is:<br>
&gt;&gt; &gt; (dynamic/c any/c current-response/c response?)<br>
&gt;&gt; &gt; where response? is the data structure predicate that the internal<br>
&gt;&gt; &gt; plumbing<br>
&gt;&gt; &gt; uses.<br>
&gt;&gt; &gt; Jay<br>
&gt;&gt; &gt; On Mon, Dec 6, 2010 at 9:51 AM, Jay McCarthy &lt;<a href="mailto:jay.mccarthy@gmail.com">jay.mccarthy@gmail.com</a>&gt;<br>
&gt;&gt; &gt; wrote:<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; That&#39;s why dynamic/c has a pre/c and post/c. Before it uses the user&#39;s<br>
&gt;&gt; &gt;&gt; contract, it applies pre/c. After it applies post/c. This ensures that<br>
&gt;&gt; &gt;&gt; the<br>
&gt;&gt; &gt;&gt; user&#39;s contract actually coerces to a response?<br>
&gt;&gt; &gt;&gt; Jay<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; On Mon, Dec 6, 2010 at 9:25 AM, Robby Findler<br>
&gt;&gt; &gt;&gt; &lt;<a href="mailto:robby@eecs.northwestern.edu">robby@eecs.northwestern.edu</a>&gt; wrote:<br>
&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; On Mon, Dec 6, 2010 at 9:23 AM, Jay McCarthy &lt;<a href="mailto:jay.mccarthy@gmail.com">jay.mccarthy@gmail.com</a>&gt;<br>
&gt;&gt; &gt;&gt;&gt; wrote:<br>
&gt;&gt; &gt;&gt;&gt; &gt; Yes, since I am allowing users to customize the coercion behavior, I<br>
&gt;&gt; &gt;&gt;&gt; &gt; could<br>
&gt;&gt; &gt;&gt;&gt; &gt; either have them provide two functions: a coercion-applies? function<br>
&gt;&gt; &gt;&gt;&gt; &gt; and a<br>
&gt;&gt; &gt;&gt;&gt; &gt; coercion function; OR I could have them just provide the coercion<br>
&gt;&gt; &gt;&gt;&gt; &gt; function<br>
&gt;&gt; &gt;&gt;&gt; &gt; and I will check the answer and re-run it inside of the function<br>
&gt;&gt; &gt;&gt;&gt; &gt; body.<br>
&gt;&gt; &gt;&gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt; The other issue is that finding all the places where I should apply<br>
&gt;&gt; &gt;&gt;&gt; &gt; the<br>
&gt;&gt; &gt;&gt;&gt; &gt; coercion inside the body of the function is difficult, because I<br>
&gt;&gt; &gt;&gt;&gt; &gt; need<br>
&gt;&gt; &gt;&gt;&gt; &gt; to do<br>
&gt;&gt; &gt;&gt;&gt; &gt; it at every place where a response/c could flow in (relatively easy)<br>
&gt;&gt; &gt;&gt;&gt; &gt; and<br>
&gt;&gt; &gt;&gt;&gt; &gt; every place where a response/c could flow out (much hard, esp. with<br>
&gt;&gt; &gt;&gt;&gt; &gt; continuations). Contracts on functions are very nice in their<br>
&gt;&gt; &gt;&gt;&gt; &gt; ability<br>
&gt;&gt; &gt;&gt;&gt; &gt; to do<br>
&gt;&gt; &gt;&gt;&gt; &gt; stuff to inputs and outputs.<br>
&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; I think I need more help to understand the programming problem better.<br>
&gt;&gt; &gt;&gt;&gt; Why are your users supplying you a contract that you are using to<br>
&gt;&gt; &gt;&gt;&gt; protect your functions? That is how can you use anything about that<br>
&gt;&gt; &gt;&gt;&gt; contract to avoid errors in your programs?<br>
&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; Robby<br>
&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt; Jay<br>
&gt;&gt; &gt;&gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt; On Mon, Dec 6, 2010 at 8:19 AM, Matthias Felleisen<br>
&gt;&gt; &gt;&gt;&gt; &gt; &lt;<a href="mailto:matthias@ccs.neu.edu">matthias@ccs.neu.edu</a>&gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt; wrote:<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; The string-&gt;number primitive is probably closer to what Jay wants<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; to<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; do.<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; The only contract I can think of for string-&gt;number is<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt;  ;; Number -&gt; Boolean<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt;  (define (string-&gt;number-able? x)<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt;    (number? (string-&gt;number x)))<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; So the real problem is a performance problem, which a lazy<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; interpretation<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; of contracts by the compiler might be able to eliminate.<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; Is this the true problem Jay -- Matthias<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; On Dec 6, 2010, at 9:45 AM, Robby Findler wrote:<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt; Let&#39;s be clear here: our inability to enforce projectionness is<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt; in<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt; no<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt; way condoning the two coercianlike contracts that you have now<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt; written.<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt; That said, the only value I see to contracts that only signal<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt; errors<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt; (or do nothing) is that programmers know what to expect from<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt; them.<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt; The<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt; downsides you mention are well taken, of course.<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt; In this specific case, your message seems slightly confused:<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt; certainly<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt; you should be able to use a contract to ensure that the coercion<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt; will<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt; always succeed. Let&#39;s assume you have done that and now discuss<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt; only<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt; where the coercing bit of the &quot;contract&quot; goes. Is it in a higher<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt; order<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt; position? Is it something that describes an interface to your<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt; module<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt; or can it be considered an internal detail?<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt; As a possible guide by analogy, consider the path-string?<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt; Predicate.<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt; It is the contract on many functions the ultimately is connected<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt; to<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt; some kind of a coercion somehwere buried inside the racket<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt; primitives<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt; for dealing with the filesystem. Is that like what you want to<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt; do?<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt; If<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt; so, how would your arguments hold up for that part of our system?<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt; Robby<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt; On Monday, December 6, 2010, Jay McCarthy<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt; &lt;<a href="mailto:jay.mccarthy@gmail.com">jay.mccarthy@gmail.com</a>&gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt; wrote:<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; These contracts are not thrown &quot;at dynamic places&quot;. The contract<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; is<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; always at the module boundary/etc, but its meaning if affected<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; by<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; the<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; dynamic context of the particular boundary crossing. [1]<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; I&#39;m been thinking about why I want to use contracts for this<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; purpose.<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; The alternative is to put an any/c contract in all the places I<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; currently have response/c and as the first thing in all those<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; functions call<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; current-any-&gt;response [or as the last thing on returns] on the<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; input<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; argument. I would then have to put a note in all the<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; documentation<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; of those<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; any/c that it doesn&#39;t REALLY accept anything, instead in other<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; accepts<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; things that the dynamic current-any-&gt;response will turn into a<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; response. If<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; the coercion failed, then I would have to throw an error, which<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; be<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; purely<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; dynamic with no blame information because it would not be<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; associated with a<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; contract boundary.<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; In contrast, using a contract for this purpose allows me to<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; centralize<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; the documentation and behavior of these arguments, get correct<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; blame on<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; places where the coercion fails, and abstract the coercion out<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; of<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; the code<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; that is using it into its interface. These are all great wins.<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; In my opinion, if I did not use contracts, the only elegant<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; thing<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; to do<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; would be to recreate something almost exactly like the contract<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; system but<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; called the coercion system. That is absurd to me when contracts<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; already do<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; exactly this.<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; Am I just not clever enough to think of another elegant way?<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; Why is there so much resistance to using the contract system in<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; a<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; perfectly legal way according to its own definition &amp; contracts?<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; [2] [i.e.<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; &quot;projection&quot; functions are not forced to be projections by any<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; means. /<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; contracts already break eq?/equal?-ness / etc]<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; Jay<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; 1. We already have such context-sensitive contracts:<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; <a href="http://docs.racket-lang.org/xml/index.html#(def._((lib._xml/main..rkt)._permissive/c))" target="_blank">http://docs.racket-lang.org/xml/index.html#(def._((lib._xml/main..rkt)._permissive/c))</a><br>

&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; permissive/c exists to allow DrRacket to embed more snips inside<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; the<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; XML boxes, which are otherwise not XML elements.<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; 2. make-contract&#39;s projection keyword has the contract (-&gt; any/c<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; any/c)<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; The example of make-contract coerces the procedure by<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; restricting<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; how<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; many arguments rather than checking that when it is given that<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; number of<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; arguments it is used properly, etc.<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; Only flat and chaperone contracts attempt to enforce<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; projection-ness.<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; On Sun, Dec 5, 2010 at 9:31 AM, Matthias Felleisen<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; &lt;<a href="mailto:matthias@ccs.neu.edu">matthias@ccs.neu.edu</a>&gt; wrote:<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; Jay, coercions aka casts in our world are compound words with -&gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; in<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; between them. Why do you need a new name?<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; (There is an inconsistency in their behavior. To wit<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; Welcome to Racket v5.0.99.4.<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt;&gt; (integer-&gt;char 1000000000000000)<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; integer-&gt;char: expects argument of type &lt;exact integer in<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; [0,#x10FFFF],<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; not in [#xD800,#xDFFF]&gt;; given 1000000000000000<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt;  === context ===<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; /Users/matthias/plt/collects/racket/private/misc.rkt:78:7<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt;&gt; (string-&gt;number &quot;a10&quot;)<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; #f<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; But that is a historical problem.)<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; ;; ---<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; I am also reluctant to throw contracts at dynamic places.<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; Contract<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; boundaries should be syntactically distinct, e.g., module<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; boundaries or<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; define/contract.<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; ;; ---<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; I think you&#39;re really just checking an assertion. So perhaps you<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; want<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; to go with /a as a suffix.<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; -- Matthias<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; --<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; Jay McCarthy &lt;<a href="mailto:jay@cs.byu.edu">jay@cs.byu.edu</a>&gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; Assistant Professor / Brigham Young University<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; <a href="http://faculty.cs.byu.edu/~jay" target="_blank">http://faculty.cs.byu.edu/~jay</a><br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt; &quot;The glory of God is Intelligence&quot; - D&amp;C 93<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt; --<br>
&gt;&gt; &gt;&gt;&gt; &gt; Jay McCarthy &lt;<a href="mailto:jay@cs.byu.edu">jay@cs.byu.edu</a>&gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt; Assistant Professor / Brigham Young University<br>
&gt;&gt; &gt;&gt;&gt; &gt; <a href="http://faculty.cs.byu.edu/~jay" target="_blank">http://faculty.cs.byu.edu/~jay</a><br>
&gt;&gt; &gt;&gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt; &quot;The glory of God is Intelligence&quot; - D&amp;C 93<br>
&gt;&gt; &gt;&gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; --<br>
&gt;&gt; &gt;&gt; Jay McCarthy &lt;<a href="mailto:jay@cs.byu.edu">jay@cs.byu.edu</a>&gt;<br>
&gt;&gt; &gt;&gt; Assistant Professor / Brigham Young University<br>
&gt;&gt; &gt;&gt; <a href="http://faculty.cs.byu.edu/~jay" target="_blank">http://faculty.cs.byu.edu/~jay</a><br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &quot;The glory of God is Intelligence&quot; - D&amp;C 93<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; --<br>
&gt;&gt; &gt; Jay McCarthy &lt;<a href="mailto:jay@cs.byu.edu">jay@cs.byu.edu</a>&gt;<br>
&gt;&gt; &gt; Assistant Professor / Brigham Young University<br>
&gt;&gt; &gt; <a href="http://faculty.cs.byu.edu/~jay" target="_blank">http://faculty.cs.byu.edu/~jay</a><br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; &quot;The glory of God is Intelligence&quot; - D&amp;C 93<br>
&gt;&gt; &gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; --<br>
&gt; Jay McCarthy &lt;<a href="mailto:jay@cs.byu.edu">jay@cs.byu.edu</a>&gt;<br>
&gt; Assistant Professor / Brigham Young University<br>
&gt; <a href="http://faculty.cs.byu.edu/~jay" target="_blank">http://faculty.cs.byu.edu/~jay</a><br>
&gt;<br>
&gt; &quot;The glory of God is Intelligence&quot; - D&amp;C 93<br>
&gt;<br>
</div></div></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>