That&#39;s the best solution I&#39;ve come up with, which is basically the abstraction I suggested under #4.<div><br></div><div>sam th<br><br>On Sunday, September 25, 2011, Carl Eastlund  wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
How about we write a &quot;define-toggle-contract-out&quot; form, so everyone<br>
can define their own without actually implementing their own.<br>
Something like so:<br>
<br>
(define-toggle-contract-out my-contract-out #:disable) ;; comment out<br>
keyword to enable<br>
(provide (my-contract-out [thing thing/c]))<br>
<br>
Carl Eastlund<br>
<br>
On Sun, Sep 25, 2011 at 7:41 PM, J. Ian Johnson &lt;<a>ianj@ccs.neu.edu</a>&gt; wrote:<br>
&gt; Everyone rolling their own is bad. We want people to contract their code, and they don&#39;t want to always pay for the overhead. #2 sounds the best, since that could be again abstracted over by the user, this time with one line instead of the sevel it takes to implement provide-cond-contract. This also has the advantage that the user can have access to any subforms someone else adds later.<br>

&gt; -Ian<br>
&gt; ----- Original Message -----<br>
&gt; From: Sam Tobin-Hochstadt &lt;<a>samth@ccs.neu.edu</a>&gt;<br>
&gt; To: J. Ian Johnson &lt;<a>ianj@ccs.neu.edu</a>&gt;<br>
&gt; Cc: Matthew Flatt &lt;<a>mflatt@cs.utah.edu</a>&gt;, <a>dev@racket-lang.org</a><br>
&gt; Sent: Sun, 25 Sep 2011 11:34:39 -0400 (EDT)<br>
&gt; Subject: Re: [racket-dev] contract-out<br>
&gt;<br>
&gt; On Sun, Sep 25, 2011 at 10:55 AM, J. Ian Johnson &lt;<a>ianj@ccs.neu.edu</a>&gt; wrote:<br>
&gt;&gt; Very nice! Is it easy to make a provide form that conditionally provides with contracts, such as Sam&#39;s provide-cond-contract in typed-scheme/utils/utils.rkt?<br>
&gt;<br>
&gt; The trouble with this is that it&#39;s not clear how it should be<br>
&gt; controlled.  There are a few obvious possibilities:<br>
&gt;<br>
&gt; 1. There&#39;s a global flag for all of Racket which turns contracts on<br>
&gt; and off.  It should be pretty clear that this is a bad idea.<br>
&gt; 2. There&#39;s a form like `(contract-cond-out expr stuff ...)&#39;  which<br>
&gt; uses the contracts in `stuff&#39; IFF `expr&#39; is true.  This is easy to<br>
&gt; implement, but pretty inconvenient to use.<br>
&gt; 3. Something like the status quo, where everyone defines their own<br>
&gt; thing, but maybe with some abstraction.<br>
&gt; 4. A compiler flag.  We don&#39;t have anything like this, though,<br>
&gt; currently, and it&#39;s not clear how it should work.<br>
&gt;<br>
&gt;<br>
&gt;&gt; -Ian<br>
&gt;&gt; ----- Original Message -----<br>
&gt;&gt; From: Matthew Flatt &lt;<a>mflatt@cs.utah.edu</a>&gt;<br>
&gt;&gt; To: <a>dev@racket-lang.org</a><br>
&gt;&gt; Sent: Sat, 24 Sep 2011 09:41:17 -0400 (EDT)<br>
&gt;&gt; Subject: [racket-dev] contract-out<br>
&gt;&gt;<br>
&gt;&gt; The `racket/contract&#39; and `racket&#39; modules now provide `contract-out&#39;,<br>
&gt;&gt; which is a `provide&#39; form for contracts. Use<br>
&gt;&gt;<br>
&gt;&gt;    (provide (contract-out ....))<br>
&gt;&gt;<br>
&gt;&gt; instead of<br>
&gt;&gt;<br>
&gt;&gt;    (provide/contract ....)<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; There&#39;s one difference between `(provide (contract-out ....))&#39; and<br>
&gt;&gt; `(provide/contract ....)&#39;: contract expressions in contract-out&#39; are<br>
&gt;&gt; implicitly moved to the end of the module, which means that they can<br>
&gt;&gt; refer to variables that are defined later. For example, the following<br>
&gt;&gt; program works as you&#39;d expect:<br>
&gt;&gt;<br>
&gt;&gt;  #lang racket<br>
&gt;&gt;<br>
&gt;&gt;  (provide (contract-out [mask-of (turtle? . -&gt; . color?)])<br>
&gt;&gt;          turtle?<br>
&gt;&gt;          color?)<br>
&gt;&gt;<br>
&gt;&gt;  (define (turtle? v)<br>
&gt;&gt;   (memq v &#39;(Leonardo Michelangelo Donatello Raphael)))<br>
&gt;&gt;  (define (color? v)<br>
&gt;&gt;   (memq v &#39;(blue orange purple red)))<br>
&gt;&gt;<br>
&gt;&gt;  (define (mask-of t)<br>
&gt;&gt;   (match t<br>
&gt;&gt;     [&#39;Leonardo &#39;blue]<br>
&gt;&gt;     [&#39;Michelangelo &#39;orange]<br>
&gt;&gt;     [&#39;Donatello &#39;purple]<br>
&gt;&gt;     [&#39;Raphael &#39;red]))<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; The `contract-out&#39; form is implemented as a provide pre-transformer,<br>
&gt;&gt; which is a new kind of `provide&#39; form that is now supported by<br>
&gt;&gt; `racket/provide-transform&#39;.<br>
&gt;&gt;<br>
&gt;&gt; _________________________________________________<br>
&gt;&gt;  For list-related administrative tasks:<br>
&gt;&gt;  <a href="http://lists.racket-lang.org/listinfo/dev" target="_blank">http://lists.racket-lang.org/listinfo/dev</a><br>
&gt;&gt;<br>
&gt;&gt; _________________________________________________<br>
&gt;&gt;  For list-related administrative tasks:<br>
&gt;&gt;  <a href="http://lists.racket-lang.org/listinfo/dev" target="_blank"></a></blockquote></div><br><br>-- <br>sam th<br><a href="mailto:samth@ccs.neu.edu">samth@ccs.neu.edu</a><br>