I should know better than format e-mails. Many a backslash eaten. The summary should be;
>> For instance; if we got up from the table with the ", """, \", \""" set of >> delimiters, we could still introduce structured delimiters in the future; >> either with repeated \ (see Swift) or repeated ". We could also follow a >> suggestion John made to use a pseudo nonce like \5" for \\\\\" or \""""". >> Sent from my iPhone > On Feb 10, 2019, at 11:43 AM, Jim Laskey <james.las...@oracle.com> wrote: > > >> >> >> Focus >> >> Instead of ordering everything on the menu and immobilizing ourselves with >> excessive gluttony, let’s focus our attention on the appetizer. If we plan >> correctly, we'll have room for entrees and desserts later. >> >> The appetizer here is simplifying the injection of "foreign" language code >> into Java source. Think tapas. We may well be sated by the time we’re done. >> >> Goal >> >> Repurposing the Java String as a "foreign" code literal seems to be the most >> natural and least intrusive contrivance for Java support. In fact, this is >> already the case. Example; >> >> // <html> >> // <body style="width: 100vw"> >> // <p>Hello World.</p> >> // </body> >> // <script>console.log("\nloaded")</script> >> // </html> >> >> String html = "<html>\n" + >> " <body style=\"width: 100vw\">\n" + >> " <p>Hello World.</p>\n" + >> " </body>\n" + >> " <script>console.log(\"\\nloaded\")</script>\n" + >> "</html>\n"; >> The primary reason we are having the string literal discussion is that the >> existing form has a few issues; >> >> The existing form is difficult to maintain without support from IDEs and is >> prone to error. The introduction and subsequent editing of foreign code >> requires additional delimiters, newlines, concatenations and escape >> sequences (DNCE). >> >> More to the point, the existing form is difficult to read. The additional >> DNCE obscure the underlying content of the string. >> >> Our aim is to come up with a DNCE lexicon that improves foreign code literal >> readability and maintainability without leaving developers in a confused >> state; with emphasis on reducing the E (escape sequences.) >> >> 50% solution >> >> Where we keep running into trouble is that a choice for one part of the >> lexicon spreads into the the other parts. That is, use of certain characters >> in the delimiter affect which characters require escaping and which >> characters can be used for escaping. >> >> So, let's pick off the lexicon easy bits first. Newlines, concatenations and >> in-between delimiters can be implicit if we just allow strings to span >> multiple lines (see Rust.) >> >> String html = "<html> >> <body style=\"width: 100vw\"> >> <p>Hello World.</p> >> </body> >> <script>console.log(\"\\nloaded\")</script> >> </html>"; >> That's not so bad. If we did nothing else, we still would be better off than >> we were before. >> >> 75% solution, almost >> >> What problems are left? >> >> The foreign delimiters (quotes) have to be escaped. >> >> The foreign escape sequences also have to be escaped. >> >> And to a lesser degree, it's difficult to locate the closing delimiter. >> >> Fortunately, we don't have many choices for dealing with escapes; >> >> Backslash is Java's escape character. >> >> Either escaping is on or is off (raw), so we need a way to flag a string as >> being escaped. We could have an option to turn escaping on/off within a >> string, but it has been hard to come up with examples where this might be >> required. >> >> Even with escaping off, we still might have to escape delimiters. Repeated >> backslashes (or repeated delimiters) is the typical out. >> >> How about trying as the flag for escapes off; >> >> String html = \"<html> >> <body style="width: 100vw"> >> <p>Hello World.</p> >> </body> >> <script>console.log("\nloaded")</script> >> </html>"; >> That doesn't work because it looks like the string ends at the first quote. >> Let's try symmetry, either " or " as the closing delimiter. " is preferable >> because then it doesn't look like an escape sequence (see Swift.) >> >> String html = \"<html> >> <body style="width: 100vw"> >> <p>Hello World.</p> >> </body> >> <script>console.log("\nloaded")</script> >> </html>"\; >> The only new string rule added is to allow multi-line strings. >> >> Adding backslash before and after the string indicates escaping off. >> >> But wait >> >> This looks like the 75% solution; >> >> Builds on our cred with existing strings. >> >> Escape processing is orthogonal to multi-line. >> >> Delimiter can easily be understood to mean “string with escapes." >> >> But wait. "" looks like it contains the end delimiter. Rats!!! Captain we >> need more sequences. >> >> And, this is the crux of all the debate around strings. Fixed delimiters >> imply a requirement for escape sequences, otherwise there is content you >> cannot express as a string. >> >> The inverse of this implication is that if you have escape sequences you >> don't need flexible delimiters. This can be reinterpreted as you only need >> flexible delimiters if you want to always avoid escape sequences. >> >> Wasn't avoiding escape sequences the goal? >> >> All this brings us to the central choice we have to make before we get into >> the rest of the meal. Do we go with fixed delimiter(s), structured >> delimiters or nonce delimiters. >> >> Fixed delimiter >> >> If we go with a fixed delimiter then we limit the content that can be >> expressed without escape sequences. This is not totally left field. There >> are floating point values we can not express in Java and types we can >> express but not denote, such as anonymous class types, intersection types or >> capture types. >> >> Everything is a degree of tradeoff. And, those tradeoffs are okay as long as >> we are explicit about it. >> >> We could get closer to the 85% mark if we had a way to have " in our content >> without escaping. Let's introduce a secondary delimiter, """. >> >> String html = """<html> >> <body style="width: 100vw"> >> <p>Hello World.</p> >> </body> >> <script>console.log("\\nloaded")</script> >> </html>"""; >> The introduction of """ would allow " with the only restriction that we can >> not use """ in the content without escaping. We could say that """ also >> means escaping off, but then we would have no way to escape """ (\"""). >> Keeping escaping as an orthogonal issue allows the best of both worlds. >> >> String html = \"""<html> >> <body style="width: 100vw"> >> <p>Hello World.</p> >> </body> >> <script>console.log("\nloaded")</script> >> </html>"""\; >> Once you take away conflicts with the delimiter, most strings do not require >> escaping. >> >> Also at this point we should note that other combinations of quotes ('''. >> ```, "'") don't bring anything new to the table; Tomato/Tomato, >> Potato/Potato. >> >> Summary: All strings can be expressed with fixed plus escaping, but can not >> express strings containing the fixed delimiter (""") with escaping off. >> >> Jumping ahead: I think that stating that traditional " strings must be >> single-line will be a popular restriction, even if it not needed. Then they >> will think of """ as meaning multi-line. >> >> Structured delimiter >> >> A structured delimiter contains a repeating pattern that can be expanded to >> suit a scenario. We attempted to introduce this notion with the original >> backtick proposal, but that proposal was withdrawn because a) didn't want to >> burn the backtick, b) developers weren't comfortable with infinitely >> repeating delimiters, and c) non-expressible anomalies such as content with >> leading or trailing backticks. >> >> Using " instead of backtick addresses a). >> >> String html = """"""<html> >> <body style="width: 100vw"> >> <p>Hello World.</p> >> </body> >> <script>console.log("\nloaded")</script> >> </html>""""""; >> For b) is there a limit where developers would be comfortable? That is, what >> about a range of fixed delimiters; ", """, """", """"", """""". This is >> slightly different than fixed delimiters in that it increases the >> combinations of content containing delimiters. Example, """"" could allow ", >> """, """", ..., Nx" for N != 5. >> >> Structured delimiters also differ from fixed delimiters in the fact that >> there is pressure to have escaping off when N >= 3. You can always fall back >> to a single ". >> >> Summary: Can express all strings with and without escaping. If the delimiter >> length is limited the there there is still a (smaller) set of strings that >> can not be expressed. >> >> Nonce delimiter >> >> A nonce or custom delimiter allows developers to include a unique character >> sequence in the delimiter. This provides a flexible delimiter without fear >> of going too far. There is also the advantage/distraction of providing >> commentary. >> >> String html = \HTML"<html> >> <body style="width: 100vw"> >> <p>Hello World.</p> >> </body> >> <script>console.log("\nloaded")</script> >> </html>"HTML\; >> Summary: Can express all strings with and without escaping, but nonce can >> affect readability. >> >> Multi-line formatting >> >> I left this out of the main discussion, but I think we can all agree that >> formatting rules should separate the delimiters from the content. Other >> details can be refined after choice of delimiter(s). >> >> String html = \""" >> <html> >> <body style="width: 100vw"> >> <p>Hello World.</p> >> </body> >> <script>console.log("\nloaded")</script> >> </html> >> """\; >> String html = """""" >> <html> >> <body style="width: 100vw"> >> <p>Hello World.</p> >> </body> >> <script>console.log("\nloaded")</script> >> </html> >> """"""; >> String html = \HTML" >> <html> >> <body style="width: 100vw"> >> <p>Hello World.</p> >> </body> >> <script>console.log("\nloaded")</script> >> </html> >> "HTML/; >> Entrees and desserts >> >> If we make good choices now (stay away from the oysters) we can still move >> on to other courses later. >> >> For instance; if we got up from the table with the ", """, ", """ set of >> delimiters, we could still introduce structured delimiters in the future; >> either with repeated (see Swift) or repeated ". We could also follow a >> suggestion John made to use a pseudo nonce like " for \\" or """"". >> >> Point being, we can work with a 85% solution now that we can supplement >> later when we're not so hangry.