Here is one example.<br><br> (make-discrete-histogram<br>  (case-&gt; (-&gt;r ((n1 integer?)<br>                (n2 (and/c integer?<br>                           (&gt;=/c n1)))<br>                (dynamic? boolean?))<br>               discrete-histogram?)<br>
          (-&gt;r ((n1 integer?)<br>                (n2 (and/c integer?<br>                           (&gt;=/c n1))))<br>               discrete-histogram?)<br>          (-&gt; discrete-histogram?)))<br><br>This code predates optional and keyword parameters. In cases like this, I can rewrite them using optional parameters.<br>
<br>But, in the random distribution functions it is the first argument that is optional and that won&#39;t work. So, for example the flat (i.e., uniform) distribution includes a contract:<br><br>  (case-&gt; (-&gt;r ((r random-source?)<br>
                (a real?)<br>                (b (&gt;/c a)))<br>               real?)<br>          (-&gt;r ((a real?)<br>                (b (&gt;/c a)))<br>               real?)))<br><br>I&#39;m not sure that one can be easily rewritten in the current contract system. [I think I would have to move the b &gt; a constraint into the code itself in the current contract system. Or, change the argument order and break backward compatibility.]<br>
<br>Doug<br><br><br><div class="gmail_quote">On Sun, Oct 24, 2010 at 6:23 PM, 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="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
The new case-&gt; only supports simple contracts, that&#39;s right. If you<br>
have more complex ones that it would be helpful to support (and can<br>
share them), that would help us guide our efforts.<br>
<br>
Thanks,<br>
Robby<br>
<br>
On Sun, Oct 24, 2010 at 7:04 PM, Doug Williams<br>
<div class="im">&lt;<a href="mailto:m.douglas.williams@gmail.com">m.douglas.williams@gmail.com</a>&gt; wrote:<br>
</div><div><div></div><div class="h5">&gt; The main problem I&#39;m having is that the code has been around awhile and<br>
&gt; hasn&#39;t been fully converted to Racket - in particular it uses the scheme<br>
&gt; language (instead of the racket language) and uses (require (lib contract)).<br>
&gt; All of that seems to mean that I can&#39;t just add #:flat? #t - I get a message<br>
&gt; that vector-of doesn&#39;t accept keyword arguments. And, the case-&gt; contracts<br>
&gt; use -&gt;r, which apparently isn&#39;t supported anymore. All that means that I<br>
&gt; can&#39;t just switch to the racket language and new contracts.  So, I have some<br>
&gt; conversion work to do.<br>
&gt;<br>
&gt; On the case-&gt; problem, it seems it no longer supports anything but -&gt;.  Is<br>
&gt; there something I am missing there?<br>
&gt;<br>
&gt; Doug<br>
&gt;<br>
&gt; On Sun, Oct 24, 2010 at 8:53 AM, Matthew Flatt &lt;<a href="mailto:mflatt@cs.utah.edu">mflatt@cs.utah.edu</a>&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt; At Fri, 22 Oct 2010 21:31:43 -0600, Doug Williams wrote:<br>
&gt;&gt; &gt; Matthew, would it make more sense to have unsafe-vector-ref (and related<br>
&gt;&gt; &gt; functions) be the more general function and unsafe-vector*-ref be the<br>
&gt;&gt; &gt; one<br>
&gt;&gt; &gt; that doesn&#39;t work  on chaperoned vectors? That is just swap the<br>
&gt;&gt; &gt; definitions.<br>
&gt;&gt; &gt; That way user code that is already using unsafe-vector-ref (etc) will<br>
&gt;&gt; &gt; continue to work.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; As it stands, existing code that has unsafe-vector-ref (etc) will often<br>
&gt;&gt; &gt; still work (in the sense of not getting any error or crashing), but just<br>
&gt;&gt; &gt; gives the wrong results. For example, if you run science-test.ss from<br>
&gt;&gt; &gt; the<br>
&gt;&gt; &gt; examples directory in the science collection, there are no errors. But,<br>
&gt;&gt; &gt; some<br>
&gt;&gt; &gt; of the answers are wrong - for example the very first one, the gamma<br>
&gt;&gt; &gt; function. [In other cases, like the FFT routines, there are either<br>
&gt;&gt; &gt; run-time<br>
&gt;&gt; &gt; errors or crashes.]<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Anyway, if it isn&#39;t too late, I think swapping the definitions would<br>
&gt;&gt; &gt; make<br>
&gt;&gt; &gt; more sense and be safer.<br>
&gt;&gt;<br>
&gt;&gt; I&#39;ve gone back and forth. I agree that it would be safer, but<br>
&gt;&gt; `vector-ref&#39; is safer still, and I think of the job of `unsafe-X&#39; as<br>
&gt;&gt; providing the lowest possible overhead over `X&#39;. It seems nicer to me<br>
&gt;&gt; to have `*&#39; mean &quot;somewhere in between&quot; rather than &quot;even faster&quot;. Then<br>
&gt;&gt; again, it seems bad that `vector?&#39; (plus index bounds) isn&#39;t enough to<br>
&gt;&gt; guard `unsafe-vector-ref&#39;.<br>
&gt;&gt;<br>
&gt;&gt; Overall, at this point in the release cycle, I&#39;m inclined to leave<br>
&gt;&gt; things where they are (i.e., it may be too late). But let&#39;s hear more<br>
&gt;&gt; opinions from those who use `unsafe-vector-ref&#39; and<br>
&gt;&gt; unsafe-vector*-ref&#39;.<br>
&gt;&gt;<br>
&gt;<br>
&gt;<br>
</div></div><div><div></div><div class="h5">&gt; _________________________________________________<br>
&gt;  For list-related administrative tasks:<br>
&gt;  <a href="http://lists.racket-lang.org/listinfo/dev" target="_blank">http://lists.racket-lang.org/listinfo/dev</a><br>
&gt;<br>
</div></div></blockquote></div><br>