[racket] phases
Phases: the fundamental slogan is that macros are elements of compilers and that you must be able to write your Scheme compiler in Prolog and your C compiler in Snobol.
Long hand: It is particularly evil to share any effects (i/o, !, exn, cc) between compiler and run-time because we ran into problems all the time (1980s). At the same time you do want the full power of programming in both parts. Meaning you want at least two distinct instances of Scheme for macro expansion and run-time.
That's how Bruce Duba and I put for 20 years, from 1986. But we just talked. Matthew's implementation some 10 years ago made it concrete and highly usable. Grateful ever since. What Bruce and I had overlooked is that it is not only correct, it adds expressive power in the practical sense that we freely use macros much more freely and thus increase our productivity. One-phase macros inhibit thought and freedom of expression.