To audition Xcode using the following multi-line syntax:

        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>
            ""
        print(xml)

You can install:  http://johnholdsworth.com/swift-LOCAL-2016-04-25-a-osx.tar.gz 
<http://johnholdsworth.com/swift-LOCAL-2016-04-25-a-osx.tar.gz>

> On 24 Apr 2016, at 23:35, Chris Lattner <[email protected]> wrote:
> 
> 
>> On Apr 23, 2016, at 2:08 PM, Brent Royal-Gordon via swift-evolution 
>> <[email protected]> wrote:
>>> I’m trying to avoid more advanced features such as the handling of 
>>> indenting which
>>> for me complicates something that if kept simple can be documented very 
>>> easily.
>> 
>> I don't think you can tackle multiline strings without worrying about 
>> indenting. Indentation may fundamentally change the approach you choose.
> 
> I agree with this and almost every point you make in your email (and your 
> other subsequent one about one approach maximally general).  That said, I 
> wonder if there is a different conclusion that can be reached.  I’m going to 
> rearrange your three features a bit:
> 
>> The way I would prefer to tackle these is:
>> 
>> * Multiline literals: If the closing quote of a string is not present, look 
>> at the next line. If it consists of (optional) indentation followed by a 
>> matching opening quote, the string has a newline and then continues after 
>> the quote on the next line. (The handling of comments is an open question 
>> here.)
>> 
>>      let xml: String = "<?xml version=\"1.0\"?>
>>                              "<catalog>
>>                              "\t<book id=\"bk101\" empty=\"\">
>>                              "\t\t<author>\(author)</author>
>>                              "\t</book>
>>                              "</catalog>"
>> 
>> The cool things about this are that (a) the compiler can tell you really do 
>> mean this to be part of the literal and you haven't just forgotten to close 
>> the string, and (b) there's no guesswork about how indentation should be 
>> handled. The uncool thing is that you need to insert the quote at the 
>> beginning of each line, so you can't just blindly paste into a multiline 
>> literal. Editors can help make that easier, though—a "paste as string 
>> literal" feature would be a nice addition to Xcode, and not just for 
>> multiline strings or just for Swift.
> 
> Yes, I completely agree.  This is is awesome, and a nice & simple 
> generalization of our existing syntax.  It has obvious behavior even if you 
> encounter it in code without knowing about the feature.
> 
>> * Disabling escapes: If you use single quotes instead of double quotes, 
>> backslash escapes are disabled.
> 
> We need a way to disable escapes, but it seems to me that (since it is 
> orthogonal to the other concerns) that it should not be tied to the “multiple 
> single quotes” syntax.  What is your thought on “modifier” prefix characters 
> for string literals?  e.g.:
> 
>       let x = e”no \escapes \(processed here”
> 
> If we supported these, they would be supported with multi-line string 
> literals by putting the modifiers on the first line of the literal, and the 
> multi-line approach above would “just work”.  You could introduce several 
> different modifiers, e.g. one that disabled general escapes, but still 
> allowed \(x) for substitution.  
> 
>> * Yes, with a number of backslashes matching the number of quotes, which 
>> allows you to insert literal \( text: '''           
>> <author>\\\(author)</author>
> 
> Egads!
> 
>> Notes on alternatives:
>> 
>> 1. If you wanted to not provide no-escaping strings, an alternative would be 
>> to say that *all* escapes require as many backslashes as there are quotes in 
>> the string delimiter. Thus, a newline escape in a `"""` string would be 
>> `\\\n`. This would in practice give you the same flexibility to write a 
>> literal without worrying (much) about escaping.
> 
> I’m really not a fan of requiring “stacking” of escapes to re-enable them.  
> This (IMO) just makes it less likely that you’ll run into an edge case.  I 
> also don’t like the “fix" being to have to use 5 quotes around your strings 
> :-)
> 
>> 3. It might be useful to make multiline `"` strings trim trailing whitespace 
>> and comments like Perl's `/x` regex modifier does.
> 
> If you have modifier characters already, it is easy to build a small zoo full 
> of these useful beasts.
> 
>> * Alternative delimiters: If a string literal starts with three, or five, or 
>> seven, or etc. quotes, that is the delimiter, and fewer quotes than that in 
>> a row are simply literal quote marks. Four, six, etc. quotes is a quote mark 
>> abutting the end of the literal.
>> 
>>      let xml: String = """<?xml version="1.0"?>
>>                              """<catalog>
>>                              """\t<book id="bk101" empty="">
>>                              """\t\t<author>\(author)</author>
>>                              """\t</book>
>>                              """</catalog>"""
>> 
>> You can't use this syntax to express an empty string, or a string consisting 
>> entirely of quote marks, but `""` handles empty strings adequately, and 
>> escaping can help with quote marks. (An alternative would be to remove the 
>> abutting rule and permit `""""""` to mean "empty string", but abutting 
>> quotes seem more useful than long-delimiter empty strings.)
> 
> I agree that there is a need to support alternative delimiters, but 
> subjectively, I find this to be pretty ugly.  It is also a really unfortunate 
> degenerate case for “I just want a large blob of XML” because you’d end up 
> using “"” almost all the time, and you have to use it on every line.
> 
> For cases like this, I think it would be reasonable to have a “heredoc” like 
> scheme, which does not allow leading indentation, and does work with all the 
> same modifier characters above.  I do not have a preference on a particular 
> syntax, and haven’t given it any thought, but this would allow you to do 
> things like:
> 
>       let str = <<EOF
> <?xml version="1.0"?>
> <catalog>
> \t<book id="bk101" empty="">
> \t\t<author>\(author)</author>
> \t</book>
> </catalog>
> EOF
> 
> for example.  You could then turn off escaping and other knobs using the 
> modifier character (somehow, it would have to be incorporated into the syntax 
> of course).
> 
> I generally agree with your down thread remarks about how Swift doesn’t like 
> to have multiple different solutions for the same problem.  OTOH, you could 
> look at “” syntax as being analogous to closure exprs, and heredoc syntax as 
> being analogous to nested functions :-)
> 
> -Chris
> 
> 
> 

_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to