[string-templates] Template expression in expression statement?
Remi Forax
forax at univ-mlv.fr
Tue Jul 25 16:24:51 UTC 2023
----- Original Message -----
> From: "Alex Buckley" <alex.buckley at oracle.com>
> To: "amber-spec-experts" <amber-spec-experts at openjdk.org>
> Sent: Tuesday, July 25, 2023 5:51:39 PM
> Subject: Re: [string-templates] Template expression in expression statement?
> On 7/25/2023 2:07 AM, Remi Forax wrote:
>> ----- Original Message -----
>>> From: "Tagir Valeev" <amaembo at gmail.com>
>>> To: "amber-spec-experts" <amber-spec-experts at openjdk.org>
>>> Sent: Tuesday, July 25, 2023 10:52:04 AM
>>> Subject: [string-templates] Template expression in expression statement?
>>
>>> Hello!
>>>
>>> It looks like, the latest javac (build 22-ea+7-489) accepts string
>>> templates as expression statements:
>>>
>>> public class Demo {
>>> public static void main(String[] args) {
>>> STR."hello";
>>> }
>>> }
>>>
>>> The expression statement spec (JLS 14.8, [1]) states that only
>>> 'StatementExpression' productions are allowed inside expression
>>> statements. This is a closed list of expressions, and it was not
>>> updated in the latest spec draft for JEP 430 [2] to include 15.8.6
>>> Template Expressions. I'm not sure what the latest consensus is. On
>>> one hand, template expression is essentially a method call that may
>>> produce a side effect (e.g. logging :D). On the other hand, such kind
>>> of usage is probably discouraged. In any case I see the discrepancy
>>> here: either spec or javac implementation should be updated.
>>
>> The JEP contains these sentences
>> "However, it is unwise for a template processor to trigger potentially
>> long-running actions in order to compose a result. It is also unwise to embark
>> upon actions that can have side effects, such as updating a database. The
>> authors of template processors are strongly advised to focus on validating
>> their input and on composing a result that gives maximum flexibility to the
>> client."
>>
>> so I believe the spec needs to be updated.
>
> The quoted text focuses on results, not side effects. (In line with
> Brian's "The spirit here is that the template processor is a *function*,
> taking some template-shaped ingredients and turning it into a useful
> *thing*, that you can then further use or manipulate.")
>
> In contrast, expression statements are all about side effects, not
> results (which are discarded).
>
> So, it's odd to read the quoted text and conclude that the _spec_ should
> be updated to make template expressions be expression statements. It's
> javac that should be updated to make template expressions _not_ be
> expression statements. I don't have any reason to think that JLS 14.8 is
> erroneous.
I'm in the camp of the less it is different from a method call the better.
The JLS is the law. This paragraph of the JEP was added recently (in June) and I see it more as the letter of the law, that's why i've quoted it.
>
> Alex
Rémi
More information about the amber-spec-experts
mailing list