lots of improvements to #define, function like macros almost work it seems