How an Optimizing Compiler Works
That is one thing I sorely miss in languages that aren't lisps. The first optimizer pass is source->source. In guile I do    ,opt expression

And it prints the source code after a first basic pass of the expander and optimizer. It does constant folding, inlining, dead code elimination and partial evaluation (and some other things). Being able to inspect what guile does helps a lot with macro writing, and is just a generally handy tool.It beats reading assembly (which is also available) any day of the week.