[swift-evolution] multi-line string literals.

Adrian Zubarev adrian.zubarev at devandartist.com
Mon Apr 3 09:23:29 CDT 2017


At quick glance I disagree with (4). If your current string would contain something like "\n\n" would you really use another empty line with a single unescaped quote? If you’re not, you’ll end up adding a single \n, but that on the other than would be strange if you add it at the end of the line.

Multi-lined strings should not be abused for adding new lines to the string itself, however I’m fine with allowing single quotes without escaping them.

If we’d really go that path then I still could not format some really long hardcoded text for code readability in a multi lined string, just because of the fact that it will alter my original string by automatically adding new line characters.

let veryLongString1 = "word word word … word word word"

let veryLongString2 = """word word word  
    word word word
    …
    word word word
    word word word"""
     
// Logically that string should be the same, however during the  
// automatic new lines we'll get this

veryLongString1 == veryLongString2 // => false
What has the multi lined string solved here? Nothing.



-- 
Adrian Zubarev
Sent with Airmail

Am 3. April 2017 um 16:00:53, Ricardo Parada (rparada at mac.com) schrieb:

What is the purpose of that backslash?  It does not feel like an improvement. 

I think we should focus on:

1. Looking pretty
2. Allow unescaped quote, double quote as well single/double apostrophe characters 
3. Allow interpolation 
4. No need to add the \n character for each line
5. It should have a continuation character
6. Keep it simple

Something like this:

let xml = M"<?xml version="1.0"?>
           "<catalog>
           " <book id="bk101" empty="">
           "     <author>\(author)</author>
           " </book>
           "</catalog>
Or maybe this:

let xml = """<?xml version="1.0"?>
            "<catalog>
            " <book id="bk101" empty="">
            "     <author>\(author)</author>
            " </book>
            "</catalog>
In the first example the multiline literal is started with M".  In the second example it starts with three double quotes """.  I really have no preference.  In both examples there is no need to have a \ or \n at the end of the line.

You can have quote characters in the string, including double quotes as shown by empty="".  You can have interpolation, i.e. \(author). 

You have a continuation character which helps as a visual guide and as a marker for the beginning of each line.

The multi string literal ends when there are no more continuation characters.



On Apr 3, 2017, at 3:01 AM, Adrian Zubarev via swift-evolution <swift-evolution at swift.org> wrote:

Hello Swift community,

on Github there is a PR for this proposal, but I couldn’t find any up to date thread, so I’m going to start by replying to the last message I found, without the last content.

I really like where this proposal is going, and my personal preference are *continuation quotes*. However the proposed solution is still not perfect enough for me, because it still lacks of precise control about the trailing space characters in each line of a multi-line string.

Proposed version looks like this:

let xml = "<?xml version=\"1.0\"?>
    "<catalog>
    "    <book id=\"bk101\" empty=\"\">
    "        <author>\(author)</author>
    "        <title>XML Developer's Guide</title>
    "        <genre>Computer</genre>
    "        <price>44.95</price>
    "        <publish_date>2000-10-01</publish_date>
    "        <description>An in-depth look at creating applications with XML.</description>
    "    </book>
    "</catalog>
    ""
I would like to pitch an enhancement to fix the last tiny part by adding the escaping character ‘' to the end of each line from 1 to (n - 1) of the n-lined string. This is similar to what Javascript allows us to do, except that we also have precise control about the leading space character through ’"’.

The proposed version will become this:

let xml = "<?xml version=\"1.0\"?>\   
    "<catalog>\ // If you need you can comment here
    "    <book id=\"bk101\" empty=\"\">\
    "        <author>\(author)</author>\
    "        <title>XML Developer's Guide</title>\
    "        <genre>Computer</genre>\
    "        <price>44.95</price>\
    "        <publish_date>2000-10-01</publish_date>\
    "        <description>An in-depth look at creating applications with XML.</description>\
    "    </book>\
    "</catalog>\
    ""
Here is another example:

let multilineString: String = "123__456__\ // indicates there is another part of the string on the next line
                              "__789_____\ // aways starts with `"` and ends with either `\` or `"`
                              "_____0_" // precise control about pre- and post-space-characters

let otherString = "\(someInstance)\ /* only comments are allowed in between */ "text \(someOtherInstance) text"
This is simply continuation quotes combined with backslash concatenation.





-- 
Adrian Zubarev
Sent with Airmail


_______________________________________________
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/20170403/03516440/attachment.html>


More information about the swift-evolution mailing list