Scheme Macros Manipulate Compilation

Scheme macro systems, while they use the term "macro", are better thought of as partially programmable compilers (still present implicitly in interpreted Scheme implementations). In contrast, a general purpose macro processor like m4 doesn't understand any of the syntax or semantics of the code it is manipulating, making it less safe and harder to use (though I have used it to extend the syntax of other languages because they don't have the macro systems Scheme has).

Scheme macro systems understand some of the semantics of Scheme, most notably scoping. Like functions, macros can have local identifiers that do not clash with the identifiers from where the macro is called. What more understanding and power to give macros is an active area of research: some allow running Scheme code to calculate the expansion of the macro, have more advanced manipulation of scope, or do syntax-checking before expansion.

Most compilers (of any language) parse code into an abstract syntax tree, and manipulate the code by manipulating the tree. Scheme syntax is a natural textual representation of such trees (more natural than other languages -- in fact some compilers of other languages use it as their textual representation once the initial code has been parsed according to that language's syntax), which is why macro systems for Scheme can so easily expose Scheme code to the user for manipulation.

Scheme tends to stop short of manipulating syntax at a level lower than would be reflected in the abstract syntax tree (called the surface syntax in parsing terminology). While you may feel this limits the expressiveness of Scheme, it is as minor as, say, the differences in Spanish versus English punctuation or German versus English word order. But if you find computation worth expressing at this level, let me know!

Manipulating Interpretation

Scheme has a datatype that captures abstract syntax trees, so even without macro systems it is easy to write Scheme code that reads and transforms Scheme code syntactically, though without much regard for the semantics. But the semantics are also so simple that interesting work in other directions has been done. For example, reflection allows Scheme interpretation to be manipulated directly.