<p>Reading <a href="http://www.paulgraham.com/articles.html" rel="noreferrer">Paul Graham's essays</a> on programming languages one would think that <a href="http://wiki.c2.com/?LispMacro" rel="noreferrer">Lisp macros</a> are the only way to go. As a busy developer, working on other platforms, I have not had the privilege of using Lisp macros. As someone who wants to understand the buzz, please explain what makes this feature so powerful.</p>

<p>Please also relate this to something I would understand from the worlds of Python, Java, C# or C development.</p>

You will find a comprehensive debate around
lisp macro here
.
An interesting subset of that article:
In most programming languages, syntax is complex.  Macros have to take apart program syntax, analyze it, and reassemble it.  They do not have access to the program's parser, so they have to depend on heuristics and best-guesses.  Sometimes their cut-rate analysis is wrong, and then they break.
But Lisp is different.  Lisp macros
do
have access to the parser, and it is a really simple parser.
A Lisp macro is not handed a string, but a preparsed piece of source code in the form of a list, because the source of a Lisp program is not a string; it is a list.
And Lisp programs are really good at taking apart lists and putting them back together.  They do this reliably, every day.
Here is an extended example.  Lisp has a macro, called "setf", that performs assignment.  The simplest form of setf is
```
```
(setf x whatever)
```
```
which sets the value of the symbol "x" to the value of the expression "whatever".
Lisp also has lists; you can use the "car" and "cdr" functions to get the first element of a list or the rest of the list, respectively.
Now what if you want to replace the first element of a list with a new value?  There is a standard function for doing that, and incredibly, its name is even worse than "car".  It is "rplaca".  But you do not have to remember "rplaca", because you can write
```
```
(setf (car somelist) whatever)
```
```
to set the car of somelist.
What is really happening here is that "setf" is a macro.  At compile time, it examines its arguments, and it sees that the first one has the form (car SOMETHING).  It says to itself "Oh, the programmer is trying to set the car of somthing.  The function to use for that is 'rplaca'."  And it quietly rewrites the code in place to:
```
```
(rplaca somelist whatever)
```
```