Hi Eli,<br><br><div class="gmail_quote">On Thu, Jul 14, 2011 at 6:04 PM, Eli Barzilay <span dir="ltr">&lt;<a href="mailto:eli@barzilay.org">eli@barzilay.org</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
Commet for the short-attention-spanners: read this:<br>
<div class="im"><br>
  <a href="http://blog.racket-lang.org/2011/04/writing-syntax-case-macros.html" target="_blank">http://blog.racket-lang.org/2011/04/writing-syntax-case-macros.html</a><br>
<br></div></blockquote><div><br>Thanks for writing this. It is so far the best introduction to this matter I&#39;ve seen.<br> </div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<div class="im">5 hours ago, Markku Rontu wrote:<br>
&gt; This tutorial helped me to understand some basics of macros. For<br>
&gt; example how to generate code with them. Now Racket has lots of other<br>
&gt; facilities as well but maybe these give you ideas how to ask more<br>
&gt; precise questions?<br>
&gt; <a href="http://hipster.home.xs4all.nl/lib/scheme/gauche/define-syntax-primer.txt" target="_blank">http://hipster.home.xs4all.nl/lib/scheme/gauche/define-syntax-primer.txt</a><br>
<br>
</div>This is *not* a good tutorial for using macros in Racket.  When you&#39;re<br></blockquote><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">

dealing with macro systems, the Scheme world has always agreed that<br>
having hygienic macros is a good idea, but there was no agreement on<br>
anything more low-level than `syntax-rules&#39;, and different<br>
implementations use different systems.  As a result of only<br>
`syntax-rules&#39; being in the report, it became somewhat popular out of<br>
necessity for people who want to write portable code.  But the bottom<br>
line is that this is really not a good way to write macros -- you&#39;re<br>
basically confining yourself to a rewrite system which is very hard to<br>
deal with, and after a lot of teeth grinding you eventually implement<br>
enough rewrites to have a lambda-calculus like thing that you can use<br>
to do a bit more programming.  (And this is where this tutorial takes<br>
you.)<br></blockquote><div><br>Still, I count it as good eye opening material :) Granted your cited blog post is good too but it&#39;s not a complete tutorial. 
<br><br></div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<br>
If you&#39;re working in Racket, it makes much more sense to really use<br>
its syntax system rather than stick to those tricks.<br>
<br></blockquote><div><br>However, I find syntax-case to be very similar if you proceed to it as next step from syntax-rules. I mean that if you take it as an improved syntax-rules, you will likely end up using it just like syntax-rules except for the part about breaking hygiene. This is just my experience.<br>
</div><div><br> </div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;"><div class="im">
&gt; On the topic of macros, I find it a bit confusing that to<br>
&gt; metaprogram in Racket, I must use such a different language of<br>
&gt; macros (with syntax-rules et al.), instead of being able to<br>
&gt; manipulate common data structures with plain old Racket functions.<br>
<br>
</div>This confusion (as have been pointed in other replies) is a direct<br>
result of reading that tutorial and thinking that you must use only<br>
`syntax-rules&#39;...<br>
<div class="im"><br>
&gt; The approach in Clojure, that the code is just a common data<br>
&gt; structure, easily manipulatable with Clojure code, is<br>
&gt; intriguing. What I must do with syntax-rules et al. brings me<br>
&gt; memories of template metaprogramming in C++, where I had to twist my<br>
&gt; mind in order to be able to do the most simple of things. Writing<br>
&gt; regular tree manipulation in Racket is easy, but manipulating the<br>
&gt; syntax tree with the macro support is not because of this &quot;language<br>
&gt; switch&quot;.<br>
<br>
</div>...and with that limitation in place, this criticism is absolutely<br>
correct.  It&#39;s a nice description for why you should really *not*<br>
limit yourself to only `syntax-rules&#39;.<br>
<br>
Read that blog post: it shows you how you can use plain racket code to<br>
write macros -- and it introduces some of the tools that make it easy<br>
to deal with syntax values.<br></blockquote><div><br>I think what is mainly missing is a bit more positive publicity in this area. A great collection of tools for writing macros exists, and obviously great things are being written using them (TR etc.). Just need to produce enough material so that the search engines start to find the good stuff.<br>
<br>-Markku <br></div></div>