Macros can be used to process lazy evaluations, but only parts of them. The main point of macros is that thanks to them, nothing is recorded in the language in it.
If programming is like playing with LEGO bricks, with macros you can also change the shape of the bricks or the material they created.
Macros are not just a deferred evaluation. It was available as fexpr (the macro predecessor in lisp history). Macros are a rewrite of a program where fexpr is just a special case ...
As an example, consider what I write in my free time, the tiny lisp compiler for javascript and initially (in the JavaScript core), I only had a lambda with support for the &rest arguments. Now support for keyword arguments, and that is because I redefined what lambda means in lisp.
Now I can write:
(defun foo (xy &key (z 12) w) ...)
and call the function with
(foo 12 34 :w 56)
When making this call in the body of the function, parameter w will be bound to 56, and parameter z to 12, because it has not been passed. I will also get a runtime error if the unsupported keyword argument is passed to the function. I could even add support for compile-time checking by overriding what compilation of expressions means (for example, adding checks if the form calls to the "static" function pass the correct parameters to the functions).
The central point is that the source (core) language did not support the keyword arguments at all, and I was able to add it using the language itself. The result is the same as if it were from the very beginning; it is just part of the language.
The syntax is important (even if it is technically possible to just use a turing machine). The syntax shapes your thoughts. Macros (and reading macros) give you complete control over the syntax.
The key point is that the code rewrite code does not use the crippled dumb language brainf ** k-like as a metaprogramming of C ++ templates (where just creating an if is an amazing achievement) or with even more dumb less than-regexp, like C -preprocessor.
Code rewriting code uses the same full-blown (and extensible) language. This lisp is all the way down; -)
Of course, writing macros is more difficult than writing regular code; but this is the “substantial complexity” of the problem, not artificial complexity, because you are forced to use a dumb semi-language, for example, with metaprogramming in C ++.
Writing macros is more complicated because the code is complex, and when writing macros you write complex things that create complex things themselves. It’s not even so unusual to go up one level more and write macro-generating macros (which comes from the old lisp joke “I write code that writes code that writes code that I get paid for”).
But macro power is simply limitless.