Proposal: Embedded Expressions for String Statements

Stefan Schulz schulz at e-spirit.de
Sun Mar 15 12:15:00 PDT 2009


Howard mentioned it before, embedding expressions might be a nice thing 
to have in Java. The simplest thing is to embed variables to print their 
value.
The proposal is not at the same level as Multi-line Strings, as it does 
not result in a construction of a String Literal but rather offers a 
"short cut" for building complex Strings.
To at least have a basis for discussion, I set up a proposal that IMO 
could fit in the scope of COIN.

Stefan


Proposal: Embedded Expressions for String Statements

AUTHOR(S):

Stefan Schulz

VERSION:

1.0    Initial version.

Formatted version:
http://docs.google.com/Doc?id=ddhp95vd_11dv7rmrcp


OVERVIEW

FEATURE SUMMARY:

Often, textual output is constructed of a mix of plain text and values 
resolving from expressions. An escape sequence allows embedding such 
expressions into a string. If the result of the expression is no String, 
it will be converted to one.

MAJOR ADVANTAGE:

Improves readability and eases String construction.

MAJOR BENEFIT:

Reduces the cluttering in writing textual output.

MAJOR DISADVANTAGE:

May encourage to write one-liners with many expressions inside a String 
construction.

ALTERNATIVES:

Write strings the old way by using concatenations or using builders.


EXAMPLES

SIMPLE EXAMPLE:
   String name = "Dave";
   System.out.println("Hello, \{name}!");

ADVANCED EXAMPLE:
   Object product = produce();
   log("We \{product == null ? "failed" : "produced \{product}"}!");


DETAILS

SPECIFICATION:

The new escape sequence \{ will be handled at compile time by 
transforming the string statement into a concatenation of Strings. 
Neither can the statement be understood as a String literal nor is it an 
escape sequence in the sense of representing a single character literal. 
Therefore, the transformation has to be done prior to any other escape 
sequence handling.

Changes are required in the JLS §3.10.5 "String Literals" and 3.10.6 
"Escape Sequences for Character and String Literals". Although the new 
escape sequence does not form a part of a String literal, it must be 
stated that it's a legit escape sequence with the consequence of making 
the string sequence become a statement rather than a literal.

A new chapter is to be introduced on embedding expressions in string 
sequences, which closely relates to §15.18.1 "String Concatenation 
Operator +". The syntax would be as follows:

EmbeddedExpressionStatement:
   " StringCharactersAndExpression StringCharactersOpt "

StringCharactersAndExpression
   StringCharactersOpt EmbeddedExpression StringCharactersAndExpressionOpt

EmbeddedExpression
   \ { Expression }

Note: The sequence "\{exp}" is deliberately chosen as it resembles the 
way other languages provide a similar ability, e.g., JavaFX ("{exp}"), 
PHP, Python and Groovy ("${exp}").

COMPILATION:

In general, the statement will be transformed into a concatenation of 
literals and expressions. In the following, the String Concatenation 
Operator is being used, but maybe replaced by a StringBuilder solution. 
The latter might be easy to do, as the transformation happens before 
literal processing.

Transformed simple example:
   String name = "Dave";
   System.out.println("Hello, " + name + "!");

Transformed complex example:
   Object product = produceSomething();
   log("We " + (product == null ? "failed" : "produced " + product) + "!");

TESTING:

The transformation has to be tested to resolve to the expected old style 
way of concatenating Strings. The cases should cover simple variable 
references (null, primitive, String, and Object) as well as simple and 
nested expressions (including nested expressions with Strings having 
embedded expressions).

LIBRARY SUPPORT:

None.

REFLECTIVE APIS:

None.

OTHER CHANGES:

None.

MIGRATION:

Replace existing old style concatenation by applying the new escape 
sequence.


COMPATIBILITY

BREAKING CHANGES:

None. The escape sequence \{ would prior have caused a compiler error.

EXISTING PROGRAMS:

No changes.


REFERENCES

EXISTING BUGS:

(Although it is to be assumed there are existing bugs/rfes, the search 
did not pop up results for the keywords used. So this remains to be done.)

URL FOR PROTOTYPE (optional):

None of yet.




More information about the coin-dev mailing list