<br><br><div class="gmail_quote">On Wed, Jan 14, 2009 at 1:14 PM, Jonathan Cast <span dir="ltr">&lt;<a href="mailto:jonathanccast@fastmail.fm">jonathanccast@fastmail.fm</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;">
<div><div></div><div class="Wj3C7c">On Wed, 2009-01-14 at 11:06 -0800, Max Rabkin wrote:<br>
&gt; On Wed, Jan 14, 2009 at 10:48 AM, Jonathan Cast<br>
&gt; &lt;<a href="mailto:jonathanccast@fastmail.fm">jonathanccast@fastmail.fm</a>&gt; wrote:<br>
&gt; &gt; Do you have an example of<br>
&gt; &gt; a macro that can&#39;t be replaced by higher-order functions and laziness?<br>
&gt;<br>
&gt; I believe I do: one macro I found useful when writing a web app in<br>
&gt; Lisp was something I called hash-bind, which binds variables to the<br>
&gt; values in a hashtable, with the variable names as keys. For example:<br>
&gt;<br>
&gt; (hash-bind (a b) hashtable body)<br>
&gt; ==<br>
&gt; (let<br>
&gt; &nbsp; &nbsp; ((a (lookup hashtable &quot;a&quot;))<br>
&gt; &nbsp; &nbsp; &nbsp;(b (lookup hashtable &quot;b&quot;))<br>
&gt; &nbsp; &nbsp; body)<br>
&gt;<br>
&gt; I found this very useful in places where I was given URL request<br>
&gt; parameters in a hashtable and wanted to extract some variables from<br>
&gt; it. I don&#39;t believe it can be replaced by a higher order function<br>
&gt; (though I may be wrong).<br>
<br>
</div></div>Thanks! &nbsp;When you *know* there&#39;s a good reason people say something, and<br>
can&#39;t find a good example of *why*, it&#39;s a tremendous relief when when<br>
you find one. &nbsp;Sort of restores your faith in humanity :)<br>
<br>
jcc<br>
<br>
<br>
</blockquote></div><br>I thought of another good case (Shamelessly stolen from Paul Graham&#39;s &#39;On Lisp&#39;).&nbsp; When defining a function to average the results of the list, you could define avg like this:<br><br>(defun avg (&amp;rest args)<br>
&nbsp; (/ (apply #&#39;+ args) (length args)))<br><br>Or as a macro like this:<br><br>(defmacro avg (&amp;rest args)<br>&nbsp; `(/ (+ ,@args) ,(length args)))<br><br>The reason the macro is better is that the length of the list is known at compile time, so you don&#39;t need to traverse the list to calculate the length of the list.<br>
<br>Food for thought, anyway.<br>