I agree that's not the best place to end up, and the idea is actually to find / implement a more ideal representation on top of it -- probably something static or declarative -- and then the layer beneath it transforms it into the "real thing".
That way the thing being specified / coded is 1st or 0 level -- and perhaps the best form reasonably possible for that thing -- and the 2nd level stuff acts more like a compiler or interpreter, which is 2nd level by definition.
The benefit is that you break free of restrictions imposed by any one language or format or editor, because you specify it exactly how you want.
This also blurs the lines between programming language, compiler/interpreter, user interaction, macros, and functions + data structures. Really these are all these same thing: specification, and the thing that builds / transforms it. The only difference is when & where that happens. Really it's all just functions + data, so my idea is to just put it all in the same place and compose / separate / invoke the different pieces in the right order.