Therefore, I wrote my own meta language: gcmc - G-Code Meta Compiler
It is a script interpreter and a context free grammar using the procedural programming language paradigm. It has complete vector calculation support and lists to trace paths easily.
It seems this is a common problem, I did something quite similar a while ago for my CNC router. I was using TurboCNC as the interpreter, which fortunately supports indirect variable references. I basically just treated the G-code interpreter as an 'assembler', and wrote my own little 'compiler', for a BASIC-like language with global and local variables, and functions with parameters and return values.
Unfortunately, I found the large programs that it generated tended to uncover some bugs in TurboCNC, and I eventually lost interest in it. It is good to see that there are a few more options available now for CNC programming.
Oh, and for the OP: It is possible to run the C preprocessor on things other than C source files - this might be a possibility if you only want something simple.