Third draft spec for String Templates (JEP 430) now available

Alex Buckley alex.buckley at oracle.com
Fri Feb 10 00:06:32 UTC 2023


On 2/9/2023 7:28 AM, Gavin Bierman wrote:
> https://cr.openjdk.java.net/~gbierman/jep430/latest 

Specifying the lexical and syntactic monster that we call a template 
expression is no mean feat, so congratulations on 15.8.6. The 
rejiggering of 15.8.6 that follows is mostly stylistic.


There's a lot going on in the first paragraph; compare with the first 
paragraphs of 15.9 and 15.12 and 15.27, where less is more. The detail 
about a template (e.g., n+1, n>0) is perhaps excessive, and unusually we 
end up introducing "template" twice -- once as a "specification" 
(brilliant word BTW) and later as something that "resembles either a 
string literal ...". I would like to spotlight the novel fact that a 
template expression delegates to a template processor to do work. I 
would also like to dial down the grammatical device of "template 
argument" and the string literal/text block possibilities -- people can 
realize all that stuff from the grammar -- our job is to introduce 
"template".

   [Best to introduce a construct using the singular form, per the
   style of 15.9, 15.10, etc.]

   A _template expression_ provides a general means of combining
   literal text with the values of expressions. The text and
   expressions are specified by a _template_. The task of combining
   the text with the expressions' values is delegated to a
   _template processor_.

   [Note] Simple interpolation of text and values into a `String`
   is available from a predefined template processor, `STR` (7.3).
   Other template processors may combine text and values in
   arbitrary ways to produce a result of a more sophisticated
   type than `String`.

   [Grammar follows. A copy-paste error has crept in for the
   recap of StringTemplateEnd and TextBlockTemplateEnd.]

   A template is either a _string template_ or a _text block template_.
   [The JLS needs to get those terms on the record.]  A string template
   (respectively, a text block template) resembles a string literal (a
   text block) but contains ... If nothing appears ...  [See 4.8 for
   another use of this "respectively" idiom.]

   A string template with _n_ embedded expressions (n>0) consists of the
   alternate interleaving of _n+1_ fragments with the n embedded
   expressions. The first fragment is a StringTemplateBegin token;
   the next n-1 fragments are StringTemplateMid tokens; the last
   fragment is a StringTemplateEnd token.  [Here, with a syntactic-
   grammar-derived StringTemplate in our hand, is where we finally
   get to describe fragments in positional terms: first, next, last.]

   A text block template with _n_ embedded expressions ...

   [Four example interleavings follow. Please avoid the term "simple
   string template". Can say: "Here is the breakdown of some string
   templates:".]

   [We have now fully described the form of a template. Time to
   motivate and derive an artifact. I'm going to avoid switching
   between "fragment" (which is a kind of token per 3.13) and
   "fragment token". Bear in mind that 3.13 defined "the content
   of a fragment".]

   The _fragment strings_ of a template represent the literal text
   that surrounds the embedded expressions. Fragment strings are
   determined as follows:

   - A string template with _n_ embedded expressions and _n+1_
     fragments has _n+1_ fragment strings, where each fragment string
     is the content of the corresponding fragment.

   - A text block template with _n_ embedded expressions and
     _n+1_ fragments has _n+1_ fragment strings, determined as follows:

     1. The _string content_ of the text block template is ...
     2. The string content of the text block template is further ...
     3. The fragment strings s_1 .. s_n+1 are based on the string content
        as follows: ...

   [Continues from the fragment strings example.]


After the "At run time ..." evaluation procedure, please add a note:

   That is, the meaning of the template expression

     e . "_x_"

   is equivalent to the meaning of the method invocation expression

     e.process(y)

   where y refers to an instance of java.lang.template.StringTemplate
   that encapsulates both the literal text in x and the values of the
   embedded expressions in x.

Alex


More information about the amber-spec-experts mailing list