My apologies, I left out one additional known limitation: raw string literals that start or end with tick.  There are numerous workarounds, none of which are beautiful, such as:

    String s = `` `foo` ``.trim();
    String s = TICK + `foo` + TICK;

## Anomalies and puzzlers

While the proposed scheme is lexically very simple, it does have some at least one surprising consequence, as well as at least one restriction:  - The empty string cannot be represented by a raw string literal (because two consecutive ticks will be interpreted as a double-tick delimiter, not a starting and ending delimiter);  - String containing line delimiters other than \n cannot be represented directly by a raw string literal.

The latter anomaly is true for any scheme that is free of embedding anomalies (escaping) and that normalizes newlines.  If we chose to not normalize newlines, we'd arguably have a worse anomaly, which is that the carriage control of a raw string depends on the platform you compiled it on.

The empty-string anomaly is scary at first, but, in my opinion, is much less of a concern than the initial surprise makes it appear.  Once you learn it, you won't forget it -- and IDEs and compilers will provide feedback that help you learn it.  It is also easily avoided: use traditional string literals unless you have a specific need for raw-ness.  There already is a perfectly valid way to denote the empty string.


Reply via email to