This is way better than what I wrote.  Thanks!<p>Here&#x27;s an example in concrete terms of the power of this technique:  <a href="https:&#x2F;&#x2F;github.com&#x2F;laarc&#x2F;monki&#x2F;blob&#x2F;master&#x2F;sudoarc.l" rel="nofollow">https:&#x2F;&#x2F;github.com&#x2F;laarc&#x2F;monki&#x2F;blob&#x2F;master&#x2F;sudoarc.l</a><p>That&#x27;s a file which adds many of Arc&#x27;s constructs to Lumen: printing (pr, prn), list building (accum), structure (w&#x2F;uniq, aif, awhen), etc.<p>To put it another way:  At the top of the file, the language available to you is Lumen.  But at the bottom of the file, the language available to you resembles Arc.  (It doesn&#x27;t redefine anything from Lumen, though, so it&#x27;s not a destructive change.)<p>That must sound pretty dubious.  It probably sounds like it&#x27;s useful only for lone-wolf programmers rather than a team.  If you give people the power to reshape the language, wouldn&#x27;t it wreak havoc in a team setting?<p>The answer turns out to be no, and it&#x27;s surprising enough to write an essay about.  Having macros available to your team ends up making your team more powerful, not less.  It&#x27;s simply a technique to generate patterns of code.<p>When coupled with a good debugger, there&#x27;s no mystery when things break.  When an error happens, you get a debug breakpoint right where the error occurred.  It makes no difference whether the error occurs during a macro expansion or during a function call, because macros are simply functions that answer &quot;What should happen next?&quot;<p>It&#x27;s like having a function that takes code as input and returns code as output, which is then executed.  Except in Javascript, you&#x27;d have to do that by representing code as strings, which get passed to eval.  In Lisp, code is a list.  Meaning you can walk through it and see &quot;This is an if statement.  This is a function call.&quot; Etc.<p>It&#x27;s true that there are ways to abuse macros which make them difficult to understand or debug.  But this is rare.  The most common case is a short, simple transformation like d0m showed: &quot;here is a pattern; please generate it.&quot;