I'm creating a project where I try to make a new language making macros.
The thing is that a macro named X
is used for 2 different usages:
to close a function call with parethesis like );}
, where ;
ends the line of code, and }
closes the block of code,
and sometimes I want just to ;}
.
In conclusion, I need to make a smart trick where sometimes the preproccessor line after line understands X
needs to be either );}
or ;}
.
Can I somehow do it with if else
statement, or somehow to strip the if
needed?
I tried some implementation of conditional value where , ( condition ? state1 : state2 )
but this was translated as as string from the preproccesor.
Also, I tried from other macros each time they called to #undef X
and redefine X
according what to do in my line, etc.
The preprocessor is not sufficiently complex to allow for things like context-dependent replacement! The preprocessor understands nothing about C++ syntax, it literally runs before the C++ parser. But you would need your preprocessor to "understand" where you need a closing symbol, and it can't do that.
And looking at the way it's standardized, I think that's intentional.
In short: you can't build a DSL that requires this. In all honestly, modern C++ is flexible enough that you can build a DSL within C++ itself, but you'd of course still be bound by C++'s general syntax. If you need something else, I'd say that C++ & the standard preprocessor probably is not the tool you need.
That being said, if you're content with putting your DSL into C++ string literals like "…"
, then you can do a compile-time DSL using constexpr
parsing – which is exactly what @vitaut's {fmt}
implements a string formatting DSL within C++.