Macro-expanded lisp works surprisingly well as an intermediate representation for some tasks. Today, I was able to enumerate all the bound variables pretty straightforwardly, because elisp only has four ways of introducing bindings! (let, let*, lambda and condition-case)