I had always assumed that case-lambda just checked alternatives in order until one matched - like a cond. But, that was just an assumption on my part and subject to being absolutely wrong. [But, if it is correct I would expect case-&gt; to allow overlapping contracts.]<br>
<br>Another thing I just noticed is that the documentation says that case-lambda is provided by scheme/base and scheme - and doesn&#39;t mention racket/base or racket. To me that implies that isn&#39;t available in the racket language, but I&#39;m sure it is. Is that a documentation error? But lambda says the same thing, so I guess it is a misinterpretation on my part of what scheme versus racket means in the docs.<br>
<br>Doug<br><br><div class="gmail_quote">On Mon, Oct 25, 2010 at 8:46 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="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Thanks, that&#39;s a great example. The idea (at least from the contract&#39;s<br>
point of view) is that there are two different functions with one name<br>
that have two different arities, I think.<br>
<br>
So maybe the right way to bring back case-&gt; is that contracts that<br>
match functions should come with some way to find out what arities<br>
they can match (this is kind of there implicitly now, but probably<br>
needs to be explicit) and then say that either there is no overlap or<br>
there is an ordering so that, given a function with some specific<br>
arity (arities) it gets slotted into particular parts of the contracts<br>
inside the case-&gt;. (thinking a little bit, I guess that we&#39;d have to<br>
say that there should not be any overlap or else we&#39;d have to kind of<br>
mix and match parts of contracts to parts of functions that seems<br>
pretty complex (if that&#39;s too opaque I can give an example to explain<br>
what I meant))<br>
<br>
Robby<br>
<br>
On Mon, Oct 25, 2010 at 9:06 AM, Doug Williams<br>
<div><div></div><div class="h5">&lt;<a href="mailto:m.douglas.williams@gmail.com">m.douglas.williams@gmail.com</a>&gt; wrote:<br>
&gt; Here is one example.<br>
&gt;<br>
&gt;  (make-discrete-histogram<br>
&gt;   (case-&gt; (-&gt;r ((n1 integer?)<br>
&gt;                 (n2 (and/c integer?<br>
&gt;                            (&gt;=/c n1)))<br>
&gt;                 (dynamic? boolean?))<br>
&gt;                discrete-histogram?)<br>
&gt;           (-&gt;r ((n1 integer?)<br>
&gt;                 (n2 (and/c integer?<br>
&gt;                            (&gt;=/c n1))))<br>
&gt;                discrete-histogram?)<br>
&gt;           (-&gt; discrete-histogram?)))<br>
&gt;<br>
&gt; This code predates optional and keyword parameters. In cases like this, I<br>
&gt; can rewrite them using optional parameters.<br>
&gt;<br>
&gt; But, in the random distribution functions it is the first argument that is<br>
&gt; optional and that won&#39;t work. So, for example the flat (i.e., uniform)<br>
&gt; distribution includes a contract:<br>
&gt;<br>
&gt;   (case-&gt; (-&gt;r ((r random-source?)<br>
&gt;                 (a real?)<br>
&gt;                 (b (&gt;/c a)))<br>
&gt;                real?)<br>
&gt;           (-&gt;r ((a real?)<br>
&gt;                 (b (&gt;/c a)))<br>
&gt;                real?)))<br>
&gt;<br>
&gt; I&#39;m not sure that one can be easily rewritten in the current contract<br>
&gt; system. [I think I would have to move the b &gt; a constraint into the code<br>
&gt; itself in the current contract system. Or, change the argument order and<br>
&gt; break backward compatibility.]<br>
&gt;<br>
&gt; Doug<br>
&gt;<br>
&gt;<br>
&gt; On Sun, Oct 24, 2010 at 6:23 PM, 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; The new case-&gt; only supports simple contracts, that&#39;s right. If you<br>
&gt;&gt; have more complex ones that it would be helpful to support (and can<br>
&gt;&gt; share them), that would help us guide our efforts.<br>
&gt;&gt;<br>
&gt;&gt; Thanks,<br>
&gt;&gt; Robby<br>
&gt;&gt;<br>
&gt;&gt; On Sun, Oct 24, 2010 at 7:04 PM, Doug Williams<br>
&gt;&gt; &lt;<a href="mailto:m.douglas.williams@gmail.com">m.douglas.williams@gmail.com</a>&gt; wrote:<br>
&gt;&gt; &gt; The main problem I&#39;m having is that the code has been around awhile and<br>
&gt;&gt; &gt; hasn&#39;t been fully converted to Racket - in particular it uses the scheme<br>
&gt;&gt; &gt; language (instead of the racket language) and uses (require (lib<br>
&gt;&gt; &gt; contract)).<br>
&gt;&gt; &gt; All of that seems to mean that I can&#39;t just add #:flat? #t - I get a<br>
&gt;&gt; &gt; message<br>
&gt;&gt; &gt; that vector-of doesn&#39;t accept keyword arguments. And, the case-&gt;<br>
&gt;&gt; &gt; contracts<br>
&gt;&gt; &gt; use -&gt;r, which apparently isn&#39;t supported anymore. All that means that I<br>
&gt;&gt; &gt; can&#39;t just switch to the racket language and new contracts.  So, I have<br>
&gt;&gt; &gt; some<br>
&gt;&gt; &gt; conversion work to do.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; On the case-&gt; problem, it seems it no longer supports anything but -&gt;.<br>
&gt;&gt; &gt; Is<br>
&gt;&gt; &gt; there something I am missing there?<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Doug<br>
&gt;&gt; &gt;<br>
&gt;&gt; &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;<br>
&gt;&gt; &gt; wrote:<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; At Fri, 22 Oct 2010 21:31:43 -0600, Doug Williams wrote:<br>
&gt;&gt; &gt;&gt; &gt; Matthew, would it make more sense to have unsafe-vector-ref (and<br>
&gt;&gt; &gt;&gt; &gt; related<br>
&gt;&gt; &gt;&gt; &gt; functions) be the more general function and unsafe-vector*-ref be the<br>
&gt;&gt; &gt;&gt; &gt; one<br>
&gt;&gt; &gt;&gt; &gt; that doesn&#39;t work  on chaperoned vectors? That is just swap the<br>
&gt;&gt; &gt;&gt; &gt; definitions.<br>
&gt;&gt; &gt;&gt; &gt; That way user code that is already using unsafe-vector-ref (etc) will<br>
&gt;&gt; &gt;&gt; &gt; continue to work.<br>
&gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt; &gt; As it stands, existing code that has unsafe-vector-ref (etc) will<br>
&gt;&gt; &gt;&gt; &gt; often<br>
&gt;&gt; &gt;&gt; &gt; still work (in the sense of not getting any error or crashing), but<br>
&gt;&gt; &gt;&gt; &gt; just<br>
&gt;&gt; &gt;&gt; &gt; gives the wrong results. For example, if you run science-test.ss from<br>
&gt;&gt; &gt;&gt; &gt; the<br>
&gt;&gt; &gt;&gt; &gt; examples directory in the science collection, there are no errors.<br>
&gt;&gt; &gt;&gt; &gt; But,<br>
&gt;&gt; &gt;&gt; &gt; some<br>
&gt;&gt; &gt;&gt; &gt; of the answers are wrong - for example the very first one, the gamma<br>
&gt;&gt; &gt;&gt; &gt; function. [In other cases, like the FFT routines, there are either<br>
&gt;&gt; &gt;&gt; &gt; run-time<br>
&gt;&gt; &gt;&gt; &gt; errors or crashes.]<br>
&gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt; &gt; Anyway, if it isn&#39;t too late, I think swapping the definitions would<br>
&gt;&gt; &gt;&gt; &gt; make<br>
&gt;&gt; &gt;&gt; &gt; more sense and be safer.<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; I&#39;ve gone back and forth. I agree that it would be safer, but<br>
&gt;&gt; &gt;&gt; `vector-ref&#39; is safer still, and I think of the job of `unsafe-X&#39; as<br>
&gt;&gt; &gt;&gt; providing the lowest possible overhead over `X&#39;. It seems nicer to me<br>
&gt;&gt; &gt;&gt; to have `*&#39; mean &quot;somewhere in between&quot; rather than &quot;even faster&quot;. Then<br>
&gt;&gt; &gt;&gt; again, it seems bad that `vector?&#39; (plus index bounds) isn&#39;t enough to<br>
&gt;&gt; &gt;&gt; guard `unsafe-vector-ref&#39;.<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; Overall, at this point in the release cycle, I&#39;m inclined to leave<br>
&gt;&gt; &gt;&gt; things where they are (i.e., it may be too late). But let&#39;s hear more<br>
&gt;&gt; &gt;&gt; opinions from those who use `unsafe-vector-ref&#39; and<br>
&gt;&gt; &gt;&gt; unsafe-vector*-ref&#39;.<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; _________________________________________________<br>
&gt;&gt; &gt;  For list-related administrative tasks:<br>
&gt;&gt; &gt;  <a href="http://lists.racket-lang.org/listinfo/dev" target="_blank">http://lists.racket-lang.org/listinfo/dev</a><br>
&gt;&gt; &gt;<br>
&gt;<br>
&gt;<br>
</div></div></blockquote></div><br>