Aphorism: Metaprogramming involves three objects: the code-as-text, the code-as-procedure, and the code-as-data.
Designing a language for metaprogramming requires two things to be true across all possible programs. One, the code-as-procedure must be easily expressible in code-as-data. Two, the code as text must clearly evoke both the code-as-procedure and the code-as-data in the mind of the coder.