[swift-evolution] [Pitch] Improve String Literals

Adrian Zubarev adrian.zubarev at devandartist.com
Tue May 16 13:32:21 CDT 2017


Would you prefer concatenation syntax using a trailing backslash over a trailing double quote?

let s = "Long strings can be bro\   
        "ken into two or more pieces."
         
let s = "Long strings can be bro"   
        "ken into two or more pieces."
At least it seems reasonable and consistent to me, because this is no more a feature for escaping new lines only, but a feature for hard wrapping string literals.

Thank you for your feedback.



-- 
Adrian Zubarev
Sent with Airmail

Am 16. Mai 2017 um 17:37:06, Gwendal Roué via swift-evolution (swift-evolution at swift.org) schrieb:


Le 16 mai 2017 à 16:39, David Hart <david at hartbit.com> a écrit :


On 16 May 2017, at 15:01, Gwendal Roué <gwendal.roue at gmail.com> wrote:

Xiaodi Wu, your opposition has been recorded. You don't buy the Motivation section. Other people here do, definitely.

Divorce the """ delimiter from the multi-line syntax and have them only support unescaped double-quotes

This means support for:

let x = "
foo
bar
"

This one is unexpected, and not requested by many users. Does it bring much?

I wonder whether this addition was introduced in order to make the proposal as consistent as possible, and prevent some criticisms. It has proven pointless. I suggest forgetting about pleasing people who don't want to be pleased, and to reconsider this "divorce" section. Consistency is not the main point. The main point is UX. This means easing the daily life of code writers, and easing the daily life of code readers (this involves being careful which text editors and code prettyfiers are unable to handle the proposal).

Well, one of the issues I have with the status-quo is that ""” has two meanings (support for “ without escaping and multi-line support), which causes consistency issues when you want to support “"” one-liners. I prefer a model where features can be orthogonally composed: hence “”” for escaping, and newlines around delimiters to signify multi-lines. Support for multi-lines with “ delimiters is a natural consequence of that model: so why disallow it?

Because this pollutes your proposal. Instead of making it simpler, it makes it more complex. You force the reader to think about the consequences of the composition of orthogonal topics, and sort between useful ones that improve life, and useless ones that pollute the mind, the time of stack overflow reviewers, and the future Swift String tutorials. Do you want to give more work to the linters and style fashionistas who love those kind of holes in language?

If the two following literals are equivalent, I suggest your forget about the first, since it brings nothing on top of SE-0168:

"
foo
bar
"

"""
foo
bar
"""

The proposal argument for it is weak:

They gain support for " delimiters, which has the nice advantage of saving a few characters in multi-line strings which are known to never contain double-quotes:

"never" is a smelly word: real programs evolve, and good diffs are local diffs:

 // bad diff
- "
+ """
...
...
...
- “Yes”, he said.
+ "Yes", he said
...
...
...
-"
+"""

Support escaping newlines in multi-line strings with a trailing \

Great. That's the main request, unless I'm misled: split long literals accross multiple lines. 

Now that Xiaodi Wu has found them, the core team questions about the trailing backslash should be addressed in more details.

Sure:

Cool. Hard-wrapping is the meat.

acknowledge[] that single-line triple quoted strings have other uses in other languages, [...] but supporting that alongside the indentation-stripping behavior leads to a lot of subtlety, and there could be other solutions to the escaping problem down the line, such as raw strings.

I’m not sure what subtleties they are referring to, so I don’t know how to address those fears. And I’m not convinced raw strings are the right solution because I’d like to retain escaping and string interpolation even in those one-liners. Raw strings are interesting, I just don’t see them as a solution for triple-quoted one-liners.

This is about "single-line triple quoted strings", not trailing backslash and hard-wrapping. Still, more about that below, in the section about C inspiration.


[d]iscussion on the list raised the idea of allowing a line to end with \ to "escape" the newline and elide it from the value of the literal.' They deliberately rejected that feature for Swift 4, reasoning that '[they] had concerns about only allowing that inside multi-line literals and felt that that could also be considered later as an additive feature.

This last one confused me. In what else than multi-line literals could we escape newlines? Be definition, if you don’t escape it, it’s a newline and your are by definition in a multi-line literal.

This means that SE-0168 was about triple-quoted literals, and that the core team felt uneasy supporting trailing backslash for triple-quoted literals only.

If you intend to provide hard-wrapping with the trailing backslash, your proposal must support it in single-quoted literals also.


Adopt the C/Objective-C syntax that concatenates single-line strings

A battle-tested solution. Doesn't it look redundant with both the "divorce" and the trailing backslash?

It may look redundant but I see them supporting two different purposes:

• Multi-line strings allow editing and copy/pasting of long strings, containing newlines, without having to prefix each line with a delimiter (because it does it’s nice leading whitespace stripping): it’s great for DSLs like SQL where newlines help readability but has no effect on parsing. But it comes at the expense of vertical space.
• The string concatenation syntax is great for shorter pieces of text where newlines should not be inserted by default and where vertical space is more conservative: greater for text messages.

If we did not have that feature, long text messages which need manual wrapping would look like:

assert(condition, “””
This is my message but after some point I need to go to the \
next line and I need to escape newlines on every line.
“”"

C string concatenation is quite good for strings that are not wrapped (think markdown), while SE-0168 literals shine for strings that are already wrapped (think commits written by Linus):

// Non-wrapped strings:

"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent sed "
"facilisis erat. Maecenas placerat nisi id lectus lacinia, a vehicula "
"mauris consequat.\n"
"\n"
"Donec quam arcu, venenatis a varius non, placerat a ligula. Proin eget "
"libero quis lacus sodales convallis lacinia in eros. Nulla mollis dictum "
"ligula, ut facilisis sapien sollicitudin in."


"""
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent sed facilisis erat. Maecenas placerat nisi id lectus lacinia, a vehicula mauris consequat.

Donec quam arcu, venenatis a varius non, placerat a ligula. Proin eget libero quis lacus sodales convallis lacinia in eros. Nulla mollis dictum ligula, ut facilisis sapien sollicitudin in.
"""

// Wrapped strings:

"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent sed\n"
"facilisis erat. Maecenas placerat nisi id lectus lacinia, a vehicula\n"
"mauris consequat.\n"
"\n"
"Donec quam arcu, venenatis a varius non, placerat a ligula. Proin eget\n"
"libero quis lacus sodales convallis lacinia in eros. Nulla mollis dictum\n"
"ligula, ut facilisis sapien sollicitudin in."


"""
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent sed
facilisis erat. Maecenas placerat nisi id lectus lacinia, a vehicula
mauris consequat.

Donec quam arcu, venenatis a varius non, placerat a ligula. Proin eget
libero quis lacus sodales convallis lacinia in eros. Nulla mollis dictum
ligula, ut facilisis sapien sollicitudin in.
"""

NB: C string concatenation has nothing to do with C's trailing backslash:

char *s = "Long strings can be bro\  
ken into two or more pieces.";

The C's trailing backslash only means "dear parser, please pretend the following newline does not exist." C has thus no support for indentation, unlike Swift and SE-0168. Since the core team has rejected triple-quoted strings that do not start with a newline because of subtleties with indentation, the proposal needs *great care* on this topic :-)

Le 16 mai 2017 à 16:58, Tony Allevato <tony.allevato at gmail.com> a écrit :

Regarding the C/Objective-C syntax, what would be the advantages over concatenating the strings with `+`?

The support for ExpressibleByStringLiteral and ExpressibleByStringInterpolation protocols.

Gwendal

_______________________________________________
swift-evolution mailing list
swift-evolution at swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20170516/adf99b2d/attachment.html>


More information about the swift-evolution mailing list