I am doing similar things in C++, Java, C# and Typescript. You don’t need LISP style macros to do it. All you need is a way to declare your intent (what the end result should be) and then code that transforms the intent into running code. You can do it offline (generating code) and/or online (running an “interpreter” that “runs” your intent live).