Thanks all for the help.<br><br>Stephan:  Good point about let*--I should&#39;ve thought of it.  Depending on how sufficiently-smart (tm) Racket is, is it not very slightly slower to create more bindings at run time (I suppose it could analyze bindings not used or immediately shadowed and drop them)?  I&#39;m not arguing <i>against</i> the let* solution, merely curious--I&#39;ll take 0.0001% slower for half the code.<br>
<br>Matthias:  Thanks for the example of Stephan&#39;s solution...it&#39;s roughly 10x better than my posted version (which was based on a 10x even worse version before I understood the pattern matching better, which was roughly comparable to the defmacro version ;))<br>
<br>What makes you say condlet is questionable?  Are there built in racket primitives or library extensions that achieve similar goals?  It is just a bad way to program, perhaps because of &quot;randomly&quot; bound nulls?<br>
<br>Vincent:  thanks for the info about define-for-syntax et al.  It&#39;d be awesome if there was a Seasoned Racketeer or On Racket or Real World Racket or Racket: App. and Interp. that took full advantage of Racket&#39;s unique advantages to showcase its power.  I&#39;m stuck reading the docs a little bit at a time...<br>
<br>My understanding from the linked blog is Racket uses phases so e.g. changing functions at REPL like (set! remove-duplicates-by 3) that might be used in macros called after this don&#39;t use the new binding.  But if I define a global run-time function, can&#39;t it be renamed in the macro phase as &lt;function_name&gt;_1, in the same way macros perform renaming as shown in the swap! example from the official docs?  Now when I run-time set &lt;function_name&gt; to 5, it&#39;s still using &lt;function_name&gt;_1 and so does not affect macro expansion.  If explaining it is too tedious or too above my current understanding feel free to say as much.<br>
<br>Robby:  I changed it to syntax-rules and you appear to be correct (still works).  Error checking be damned...<br>