<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META content="text/html; charset=iso-8859-1" http-equiv=Content-Type>
<META name=GENERATOR content="MSHTML 9.00.8112.16443">
<STYLE></STYLE>
</HEAD>
<BODY bgColor=#ffffff>
<DIV><FONT size=2 face=Arial>Matthias Felleisen &lt;matthias@...&gt; 
writes:</FONT></DIV>
<DIV><FONT size=2 face=Arial>. <BR>&gt; <BR>&gt; If this is about sequencing a 
bunch of functional manipulations, try this: <BR>&gt; <BR>&gt; #lang 
racket<BR>&gt; <BR>&gt; ;; this would be in a library<BR>&gt; <BR>&gt; 
(define-syntax let**<BR>&gt;&nbsp;&nbsp; (syntax-rules 
()<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp; [(_ tmp body) 
body]<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp; [(_ tmp a b ... body) (let ([tmp a]) 
(let** tmp b ... body))]))<BR>&gt; <BR>&gt; ;; 
-----------------------------------------------------------------------------<BR>&gt; 
<BR>&gt; (define (fix str)<BR>&gt;&nbsp;&nbsp; (let** tmp 
str<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
(regexp-replace* " / " tmp 
"_")<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
(regexp-replace* " " tmp 
"_")<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
(regexp-replace* "%" tmp 
"")<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
(regexp-replace* "-" tmp 
"_")<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
(string-upcase tmp)))<BR>&gt; <BR>&gt; (fix "this/is%a-test right?")<BR>&gt; 
<BR>&gt; I have found this useful and readable in circumstances where the above 
is a sequence of say image<BR>&gt; manipulations where even a for/fold isn't 
quite right. <BR>&gt; </FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT size=2 face=Arial>Using this macro that Matthias shared I made a nice 
little "tuning tool".&nbsp; </FONT></DIV>
<DIV><FONT size=2 face=Arial></FONT>&nbsp;</DIV>
<DIV><FONT size=2 face=Arial>I added the macro form&nbsp;let**&nbsp;&nbsp; to a 
library and then created a "companion macro" let-debug** which was similar but 
which printed out the manipulating procedure name.and wrapped 
the&nbsp;manipulating procedure with the "time" function&nbsp;&nbsp; 
I.e.</FONT></DIV>
<DIV><FONT size=2 face=Arial></FONT>&nbsp;</DIV>
<DIV><FONT size=2 face=Arial>(define-syntax let-debug**<BR>&nbsp; (syntax-rules 
()<BR>&nbsp;&nbsp;&nbsp; [(_ tmp body) (begin (displayln 'body) (time 
body))]<BR>&nbsp;&nbsp;&nbsp; [(_ tmp a b ... body) (let ([tmp (begin (displayln 
'a) (time a))]) (let-debug** tmp b ... body))]))<BR></FONT></DIV>
<DIV><FONT size=2 face=Arial></FONT>&nbsp;</DIV>
<DIV><FONT size=2 face=Arial></FONT>&nbsp;</DIV>
<DIV><FONT size=2 face=Arial>So I write something like:</FONT></DIV>
<DIV><FONT size=2 face=Arial></FONT>&nbsp;</DIV>
<DIV><FONT size=2 face=Arial>(let-debug**&nbsp;data image-data</FONT></DIV>
<DIV><FONT size=2 face=Arial>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
(image-&gt;transformation1 data)</FONT></DIV>
<DIV><FONT size=2 face=Arial>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
(transformation1-&gt;transformation2&nbsp; data)</FONT></DIV>
<DIV><FONT size=2 face=Arial>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
(transformation2-&gt;transformation3 data)</FONT></DIV>
<DIV><FONT size=2 face=Arial>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; etc. 
etc.)</FONT></DIV>
<DIV><FONT size=2 face=Arial></FONT>&nbsp;</DIV>
<DIV><FONT size=2 face=Arial>This then prints out each procedure name and the 
cpu, garbage collection and actual time&nbsp;it uses.&nbsp; I can then see any 
inefficiencies and once I've fixed these, instead of having to take out a bunch 
of "display" and "time" functions&nbsp;I just have to change one word in my 
code&nbsp;" &nbsp;let-debug** " back to "&nbsp; let**&nbsp;&nbsp; " to stop 
printing the debugging information and&nbsp;be back in production 
code.</FONT></DIV>
<DIV><FONT size=2 face=Arial></FONT>&nbsp;</DIV>
<DIV><FONT size=2 face=Arial>Harry Spier</DIV>
<DIV><BR></DIV></FONT></BODY></HTML>