Update on String Templates (JEP 459)
Maurizio Cimadamore
maurizio.cimadamore at oracle.com
Fri Mar 15 16:31:28 UTC 2024
Hi
On 15/03/2024 16:07, Guy Steele wrote:
> Then again, now that I ponder the space of use cases, it may be that,
> despite my initial enthusiasm, having a separate string interpolation
> syntax may not carry its weight if its uses are relatively rare. We
> always have the option of using a string template and then applying an
> interpolation processor (which might be spelled
> `String.of(<template>)` or `(<template>).interpolate()` or some other
> way), and about all we lose from that approach is the ability to use
> string interpolation to specify a constant expression—for which we
> still have the old-fashioned alternative of using `+` concatenation.
> If we drop string interpolation, we can then drop the INTERPOLATION
> prefix, and we are back to a single-prefix model, and the remaining
> question is whether that prefix is optional, at least in some cases.
> Okay, I think I now have a better understanding of the relationships
> among the various proposals in the design space. Thanks for your patience.
I think the advantage for /not/ having a string interpolation prefix, is
that then interpolation is “just another processor” e.g. a static method
somewhere that takes a string template and returns a String. Another
String::format, in a way. So that leads to a rather uniform design.
>
>
> And now that I have that better understanding, I think I lean toward
> (a) abandoning string interpolation and (b) having a single, short,
> _non-optional_ prefix for templates (“$” would be a plausible choice),
> on the grounds that I think it makes code more readable if templates
> are always distinguished up front from strings—and this is especially
> helpful when the templates are rather long and any `\{` present might
> be far from the beginning. It has a minimal number of cases to explain:
>
> “…” string literal, must not contain \{…}, type String
> $”…” template literal, may contain \{…}, type StringTemplate
Yep, I agreee this a very principled way to look at the problem.
>
> I think we have all made an honest effort to explain string templates
> as a simple and clean superset of string literals, but now that we
> have considered the typing and overloading issues, my opinion is that
> it just isn’t possible without some amount of unwanted complication.
> Strings and string templates are just different beasts, and we would
> do well to maintain that distinction rather than trying to conflate
> them. Yes, requiring a prefix on templates would impose a small
> cost—perhaps we should regard it as a "syn-tax" rather than a “cover
> charge”—on every template we write, but I judge that cost well worth
> it for the readability it would buy.
>
> (By the way, I appreciate John’s suggestion of allowing a template to
> begin with “\{} , but this strikes me as kind of a hack rather than a
> natural use of the \{…} syntax. A distinctive single-character prefix
> would be better.)
I think there’s a place for {}. E.g. where {} shines IMHO, is to allow
for /comments/ inside string templates:
|t""" hello this is \{ /* a comment here */ } a commented template """ |
But as a “template” prefix, it’s a bit of a lousy choice. For instance,
one can argue that “1.0” is different from “1”. But there’s only one
place where to look for that “.0”. Whereas, inside a text block, you can
have many different places where the {} ends up. So, while this solves
the problem for compiler writers, {} is not a good solution for us humans.
Maurizio
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/amber-spec-experts/attachments/20240315/892cf0db/attachment-0001.htm>
More information about the amber-spec-experts
mailing list