<div dir="ltr"><div><div><div><div><div>Thanks for the advice! It&#39;s certainly been an interesting journey into Typed Racket... :) <br><br>Here are the results thus far (for a 256x256 perlin, simplex, and colored-simplex image).<br>

</div><br></div><div>Original:<br><span style="font-family:courier new,monospace">  cpu time: 1139 real time: 1134 gc time: 232<br>  cpu time: 780 real time: 773 gc time: 124<br>  cpu time: 1950 real time: 2044 gc time: 328</span><br>

</div><div><br></div>Typed:<br><span style="font-family:courier new,monospace">  cpu time: 640 real time: 653 gc time: 110<br>  cpu time: 546 real time: 542 gc time: 62<br>  cpu time: 1342 real time: 1364 gc time: 218</span><br>

<br></div>So it&#39;s definitely a good start. <br><br></div>Unfortunately, there are a few oddities that I&#39;m not sure how to deal with.<br><br></div><b>1) </b>Which is more idiomatic / easier for Typed Racket to deal with:<br>

<br><span style="font-family:courier new,monospace">(: mix (Flonum Flonum Flonum -&gt; Flonum))<br>(define (mix a b t)<br>  ...)</span><br><span style="font-family:courier new,monospace"><br>(define: (mix [a : Flonum] [b : Flonum] [t : Flonum]) : Flonum<br>

</span><div><span style="font-family:courier new,monospace">  ...)</span><br><br></div><div>Right now, I&#39;m using the former, but I&#39;m not sure I&#39;m happy with it.<br><br></div><div><b>2)</b> How can I deal with integer values (specifically 0) to a function with flonum types?<br>

<br></div><div>Specifically, perlin (and simplex) have the type:\<br><br><span style="font-family:courier new,monospace">(: perlin<br>   (case-&gt; (Flonum -&gt; Flonum)<br>           (Flonum Flonum -&gt; Flonum)<br>           (Flonum Flonum Flonum -&gt; Flonum)))</span><br>

<br></div><div>But if I try to do something like this:<br><br></div><div><span style="font-family:courier new,monospace">(perlin (* 1.0 (/ 0 256)))</span><br><br>I get this error:<br><span style="font-family:courier new,monospace"><br>

Type Checker: No function domains matched in function application:<br>Domains: Flonum Flonum Flonum<br>         Flonum Flonum<br>         Flonum<br>Arguments: Zero</span><br><br></div><div>Basically, <span style="font-family:courier new,monospace">(* 1.0 (/ 0 256))<span style="font-family:arial,helvetica,sans-serif"> is</span></span><span style="font-family:courier new,monospace"><span style="font-family:arial,helvetica,sans-serif"> </span>0</span>, not <span style="font-family:courier new,monospace">0.0</span>. For the timing tests above, I worked around this with <span style="font-family:courier new,monospace">real-&gt;double-flonum</span> but that seems suboptimal (they types are leaking). Is there something I&#39;m missing there?<br>

<br></div><div><b>3)</b> How do I type a color% / bitmap%?<br><br></div><div>I tried typing noisy-image-test.rkt, but I kept running into this. I can use Any, but it seems like objects should be typeable. No luck finding out how though.<br>

</div><div><br>I&#39;ll keep hacking at it, but that&#39;s what I have for the moment.<br><br>JP<br></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Thu, Apr 11, 2013 at 3:54 PM, Vincent St-Amour <span dir="ltr">&lt;<a href="mailto:stamourv@ccs.neu.edu" target="_blank">stamourv@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">At Thu, 11 Apr 2013 13:07:27 -0400,<br>
JP Verkamp wrote:<br>
&gt;<br>
&gt; [1  &lt;multipart/alternative (7bit)&gt;]<br>
&gt; [1.1  &lt;text/plain; UTF-8 (7bit)&gt;]<br>
<div><div class="h5">&gt; Partially out of curiosity and partially in my ongoing quest to try out<br>
&gt; game development in Racket, I&#39;ve implemented a pure Racket version each for<br>
&gt; Perlin and simplex noise. It&#39;s pretty much a direct translation of the code<br>
&gt; from this PDF, originally in C:<br>
&gt; <a href="http://webstaff.itn.liu.se/~stegu/simplexnoise/simplexnoise.pdf" target="_blank">http://webstaff.itn.liu.se/~stegu/simplexnoise/simplexnoise.pdf</a><br>
&gt;<br>
&gt; Here is a blog post with some pretty pictures but little actual code:<br>
&gt; <a href="http://blog.jverkamp.com/2013/04/11/perlin-and-simplex-noise-in-racket/" target="_blank">http://blog.jverkamp.com/2013/04/11/perlin-and-simplex-noise-in-racket/</a><br>
&gt;<br>
&gt; Here&#39;s just the code:<br>
&gt; <a href="https://github.com/jpverkamp/noise" target="_blank">https://github.com/jpverkamp/noise</a><br>
&gt;<br>
&gt; It&#39;s definitely not pure / functional, but I think it&#39;s relatively easy to<br>
&gt; read (or as easy as noise functions can be).<br>
&gt;<br>
&gt; What I&#39;m wondering though is if someone with a bit more experience in<br>
&gt; optimizing Racket code could take a look at it. I know that it should be<br>
&gt; possible to get a bit more speed; it&#39;s almost all number crunching, mostly<br>
&gt; floating point math but with a few integer only bits (those are causing the<br>
&gt; most trouble...). At the moment, I can think of at least three routes for<br>
&gt; optimization although I&#39;m probably missing something:<br>
&gt;<br>
&gt; - using (racket/floum) -- I&#39;ve tried just blindly replacing * + - / with<br>
&gt; fl* fl+ fl- fl/ (and fixing the numerous errors that crop up), but it<br>
&gt; doesn&#39;t seem to result in much of a speedup at all. I think that this is a<br>
&gt; combination of still requiring runtime checks on the values and having to<br>
&gt; convert between exact/inexact, but I&#39;m not sure.<br>
&gt;<br>
&gt; - using Typed Racket -- Theoretically this will allow the compiler to<br>
&gt; choose the correct functions as above and avoid having to do any runtime<br>
&gt; checks at all, although I&#39;m not sure how much of that has been implemented.<br>
<br>
</div></div>I had a quick look at your code, and I think Typed Racket should be able<br>
to help. The TR optimizer can specialize numeric operations, which<br>
removes runtime checks and allows the Racket compiler to unbox<br>
intermediate results.<br>
<br>
To get the most of the TR optimizer, you can try the Optimization Coach<br>
DrRacket plugin. It reports the specializations that TR is doing and<br>
points out specialization opportunities that would require code/type<br>
changes to be safe.<br>
<span class="HOEnZb"><font color="#888888"><br>
Vincent<br>
</font></span></blockquote></div><br></div>