Macros by Example.
Macros let you change your language to suit your problem. This is extremely powerful: You can build up your language so you can express your problem as clearly as possible. This makes your code more concise and simple, which in turn makes your system more malleable.
But a bigger advantage is that it makes it possible to write Lisp programs that reliably generate and transform Lisp source code. If you’re not used to Lisp, it’s hard to imagine how tremendously useful this is. People who come from the Perl and C world have a deep suspicion of source code transformation, because it’s invariably unreliable.