Date: Mon, 16 Oct 2023 11:37:10 +0200
Hi Hadriel,
I really have not known, whether it was working with the preprocessor, without reading up and trying out.
I think that topic belongs slightly together with the escaping/delimiter discussion and there are five basic options to activate the preprocessor:
A) Each (or only the more complex) C++ expression leave the F string and resume it, everything is concateated, e.g.:
print( X"SOME_FLAG = {" SOME_FLAG ":x}" );
- easier to include the preprocessor without preprocessing time parsing
- proliferation of quotes/unquotes
- looks more like the iostream way, when we add + or even << in between
B) simple specific escaping
print( X"SOME_FLAG = { ####SOME_FLAG####:x }" );
- the part between #### #### is handled by the preprocessor, although it is within a X/R string
- also helps with colon
- possible to forget for generic code, except if #### required for all {} expressions, e.g. a l-value identifier could be a preprocessor redefined symbol
- so either it is required every time (no simple {lvalue} possible anymore) or it is only used, when needed and will be often forgotten or other code changes (SOME_FLAG is suddenly a preprocessor define) that would require it
C) complete escaping
print( X"SOME_FLAG = { a ? \"\\\\\" \\: \"\\:\" :x }" ); // for a ? "\" : ":"
- certain characters are escaped: '"', '\', '}', ':'
- not easy to read
- better (?) than heuristics with additional paranthesis, which only sometimes work
D) Flexible escaping similar to raw string literals
print( X"SOME_FLAG = {dch{ a ? b : c :dchx }dch" );
- with dch a delim character sequence, which can be freely chosen
E) have the preprocessor parse the string itself
print( X"SOME_FLAG = { SOME_FLAG:x}" );
- most difficult to sync WG21/WG14
-----Ursprüngliche Nachricht-----
Von:Hadriel Kaplan <hkaplan_at_[hidden]>
Gesendet:So 15.10.2023 18:45
Betreff:Re: [std-proposals] Supporting f-strings in C++: draft-R1
An:std-proposals_at_[hidden];
CC:Sebastian Wittmeier <wittmeier_at_[hidden]>;
> From: Std-Proposals <std-proposals-bounces_at_[hidden]> on behalf of Sebastian Wittmeier via Std-Proposals <std-proposals_at_[hidden]>
> you write that there is no preprocessor support within the f-strings.
> Is it possible to concatenate preprocessor macro results with preprocessor string concatenation?
> If yes, would it be further possible to have the preprocessor preprocess code in its usual way, put it through a STRINGIFY macro and concatenate it into the f string?
You can use preprocessor macros to stringify other macro expansions as you can do today, of course - but as far as I know the preprocessor cannot concatenate two string literals into one token literal using the `##`. It's usually the phase-6 translation right afterwards that concatenates them instead.
So then I don't see how you'd get it to become an f-string, since presumably you'd want to join multiple stringified literals into one final f-string.
For just _one_ stringified macro I think you can do it, but that doesn't seem useful.
I.e., you might be able to get a stringified `__LINE__` for line 42 to become a `F"42"`, but if you wanted it to become `F"{42:x}"` instead, I don't think that's possible. (though I'm no PP expert)
I mean basically think of the `F"..."` or `X"..."` as being similar to `R"(...)"` in terms of tokens, and you can try to create an `R"(...)"` using the preprocessor today to see if it's possible - I don't think it is, but I might be wrong. If it _is_ possible then it should be possible to do for f-strings too.
---
Or maybe I misunderstand you - are you instead saying: "I know macro-magic won't work with f-strings as defined, but can the proposal define some way for it to work?"
-hadriel
Juniper Public
Received on 2023-10-16 09:37:12