Soweit ich seine vorgehensweise verstanden habe, kann man in den Klammern beliebige Ausdrücke schreiben. Beim Kompilieren wird ein solcher String dann in einen Ausdruck der Form "Test: ".append(xyz.getAbc()) umgewandelt.
Exakt
Das hat automatisch zur Folge, dass nur Stringliterale entsprechend ausgewertet werden können, nicht aber zur Laufzeit so zusammengebaute Zeichenfolgen
Wieder richtig. Sooo dynamisch ist meine Sprache dann auch nicht ;-)
Steigt da der Aufwand des parsens nicht auch extrem an?
Zwar ein wenig, aber nicht so sehr, dass es zur Last würde. Ich habe sogar nicht mal den Parser erweitert, sondern nur den Scanner.
D.h. anstatt eines einzelnen String Tokens werden dann mehrere Tokens vom Scanner ausgespuckt, und der Parser bekommt von dieser Kurzschreibweise gar nichts mit.
Ähnlich wie in C und C++, ist der Backslash in einem String Literal sowieso schon als Escape Character reserviert.
Wenn ich die String Interpolation nicht mit dieser Syntax anbieten würde, würde es bei dem String "\(x)" einfach zu einem Syntax Fehler kommen, weil "\(" kein gültiger 'Special Character' ist.
Und die Konkatenierung mit + wird von sehr vielen Sprachen verwendet, neben Java wären C#, JavaScript oder Python weitere Beispiele (und ich würde vermuten, std::string aus C++ sollte danke Operatorenüberladung auch dazu gehören).
In C++ ist der + Operator im std::string (genauer gesagt std::basic_string) überladen, ja. Aber hier ist es ein wenig anders als in Java:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
|
// Java
int x = 12;
"x = " + x; // OK, ergibt "x = 12"
// C++
int x = 12;
"x = " + x; // ERROR: 'undefined behavior'
|
Da in C++ ein String Literal vom Typ "const char*" ist und nicht vom Typ "std::string", muss hier manuell in einen std::string umgewandelt werden, ansonsten wird mit '+x' ein Integer Wert auf den Pointer addiert!
D.h. Ausdrücke wie
3 + 4 + "test" + 3 + 4 sind in C++ ohne hin nicht gültig.
Daher mein Vergleich primär mit Java :-)
Gruß,
Lukas