<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb2312">
<META NAME="Generator" CONTENT="MS Exchange Server version 6.5.7036.0">
<TITLE>RE: [racket] case form implemented with a hash</TITLE>
</HEAD>
<BODY>
<!-- Converted from text/rtf format -->

<P><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">Thanks Matthew.</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">I read the paper.</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">In my case I have a case form which dispatches on a character, 86 different ones. Therefore I can dispatch by means of a vector. However, almost every character has its own clause and therefore dispatching on the index of the character would give no speed up. I already tried a hash-table and a vector (making sure it is computed once only) The values in the table/vector are procedures that run the body of a clause. The vector is used as follows:</FONT></SPAN></P>

<P><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">(define (parse-fmt-instr parser-state) ; Parses one single instruction.</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">&nbsp;(skip-white-fmt-and-commas parser-state)</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">&nbsp;(let ((char (pop-fmt-char parser-state #f)))</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">&nbsp; (and char</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">&nbsp;&nbsp; (if (char=? char #\</FONT></SPAN><SPAN LANG="el"><FONT SIZE=2 FACE="Courier New Greek">¶ň) call-proc-instr</FONT></SPAN>

<BR><SPAN LANG="el"><FONT SIZE=2 FACE="Courier New Greek">&nbsp;&nbsp;&nbsp; (let ((i (char-&gt;integer char)))</FONT></SPAN>

<BR><SPAN LANG="el"><FONT SIZE=2 FACE="Courier New Greek">&nbsp;&nbsp;&nbsp;&nbsp; (if (&lt; i 128)</FONT></SPAN>

<BR><SPAN LANG="el"><FONT SIZE=2 FACE="Courier New Greek">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((vector-ref parser-table i) parser-state char)</FONT></SPAN>

<BR><SPAN LANG="el"><FONT SIZE=2 FACE="Courier New Greek">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (fmt-error parser-state)))))))</FONT></SPAN><SPAN LANG="es"></SPAN>
</P>

<P><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">However, as you predicted, I found no speed up. With a hash table in some cases even a slow down.</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">The gain in speed of dispatching seems to be destroyed by the extra procedure call.</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">I think Clinger's paper is particularly useful for case forms wih many keys but few clauses.</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">Thanks for your help.</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">Jos </FONT></SPAN>
</P>

<P><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">-----Original Message-----</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">From: Matthew Flatt [</FONT></SPAN><A HREF="mailto:mflatt@cs.utah.edu"><SPAN LANG="es"><U><FONT COLOR="#0000FF" SIZE=2 FACE="Courier New">mailto:mflatt@cs.utah.edu</FONT></U></SPAN></A><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">] </FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">Sent: mi®¶rcoles, 28 de septiembre de 2011 22:59</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">To: Jos Koot</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">Cc: 'Racket-users'</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">Subject: RE: [racket] case form implemented with a hash</FONT></SPAN>
</P>

<P><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">I had in mind the comment on page 64, bottom right, but I see that it's</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">a smaller comment than in my memory.</FONT></SPAN>
</P>

<P><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">Overall, I think it will work better to use a hash table to go from a</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">value to an index, and then use a binary search on the index as in</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">Clinger's paper. Indirect dispatch via thunks in a hash table will most</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">likely be slower.</FONT></SPAN>
</P>

<P><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">At Wed, 28 Sep 2011 22:55:08 +0200, &quot;Jos Koot&quot; wrote:</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">&gt; Hi Hatthew,</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">&gt; I am still trying to implement 'case' by means of a hash.</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">&gt; Can you give me a more specific pointer. I followed your pointer but did not</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">&gt; see anything relevant to my question.</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">&gt; Jos </FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">&gt; </FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">&gt; -----Original Message-----</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">&gt; From: Matthew Flatt [</FONT></SPAN><A HREF="mailto:mflatt@cs.utah.edu"><SPAN LANG="es"><U><FONT COLOR="#0000FF" SIZE=2 FACE="Courier New">mailto:mflatt@cs.utah.edu</FONT></U></SPAN></A><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">] </FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">&gt; Sent: mi®¶rcoles, 28 de septiembre de 2011 22:20</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">&gt; To: Jos Koot</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">&gt; Cc: 'Racket-users'</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">&gt; Subject: Re: [racket] case form implemented with a hash</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">&gt; </FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">&gt; At Wed, 28 Sep 2011 22:08:44 +0200, &quot;Jos Koot&quot; wrote:</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">&gt; &gt; By inspection with the macro stepper I found that case forms are expanded</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">&gt; to</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">&gt; &gt; nested if-forms. For case forms with many clauses, this may be</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">&gt; inefficient.</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">&gt; &gt; I have tried to prepare a hash-case form using a hash table in order to</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">&gt; &gt; select the desired clause more efficiently. So far my attempts failed. I</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">&gt; am</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">&gt; &gt; still trying. However, has anybody else on this list thought of using a</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">&gt; hash</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">&gt; &gt; for case forms with many clauses? Does it exist? If not, would anyone be</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">&gt; &gt; interested in a hash-case form that has the same shape as a case-form, but</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">&gt; &gt; uses a hash-table to select the appropriate clause? The hash table should</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">&gt; be</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">&gt; &gt; a map onto thunks and macro hash-case simply would have to retrieve the</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">&gt; &gt; thunk and call it.</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">&gt; </FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">&gt; See &quot;Rapid Case Dispatch in Scheme&quot;, Clinger, Scheme'06.</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">&gt; </FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">&gt; If you implement a revised `case' that consistently works better, then</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">&gt; I'd be happy to use it as a replacement for the current `case'.</FONT></SPAN>
</P>

</BODY>
</HTML>