Tracking the discussion, I’ve updated the prototype toolchain to support the 
following types of string:

        let multipart1 = "one" "two"
        let multipart2 = “one\n"
            “two\n"
        let multipart3 = "one
            “two\n"
        let regex = e"\w[\w\d]*\n"

It can be downloaded here: 
http://johnholdsworth.com/swift-LOCAL-2016-04-26-a-osx.tar.gz

Due to an implementation detail the e”” escaped strings still process escapes 
and interpolation
which is how I would argue it should be anyway. The “e” modifier just mutes the 
invalid escape error.

I’d only like to add I hope we can avoid HEREDOC strings are compared to 
Brent’s continuation
approach as the aesthetics are not at all good.

> On 26 Apr 2016, at 07:04, Chris Lattner <[email protected]> wrote:
> 
> On Apr 25, 2016, at 5:22 PM, Brent Royal-Gordon <[email protected]> 
> wrote:
>>>> 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.
>> 
>> Modifiers are definitely a workable alternative, and can be quite flexible, 
>> particularly if a future macro system can let you create new modifiers.
> 
> Right. I consider modifiers to be highly precedented in other languages, and 
> therefore proven to work.  If we go this way, I greatly prefer prefix to 
> postfix modifiers.
> 
>>>> * 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.
>> 
>> On the other hand, the `"""` does form a much larger, more obvious 
>> continuation indicator. It is *extremely* obvious that the above line is not 
>> Swift code, but something else embedded in it. It's also extremely obvious 
>> what its extent is: when you stop seeing `"""`, you're back to normal Swift 
>> code.
> 
> Right, but it is also heavy weight and ugly.  In your previous email you said 
> about the single quote approach: "The quotation marks on the left end up 
> forming a column that marks the lines as special”, so I don’t see a need for 
> a triple quote syntax to solve this specific problem.
> 
>> I *really* don't like the idea of our only alternatives being "one 
>> double-quote mark with backslashing" or "use an entire heredoc". Heredocs 
>> have their place, but they are a *very* heavyweight quoting mechanism, and 
>> relatively short strings with many double-quotes are pretty common. 
>> (Consider, for instance, strings containing unparsed JSON.) I think we need 
>> *some* alternative to double-quotes, either single-quotes (with the same 
>> semantics, just as an alternative) or this kind of quote-stacking.
> 
> I agree that this is a real problem that would be great to solve.
> 
> If I step back and look at the string literal space we’re discussing, I feel 
> like there are three options:
> 
> 1) single and simple multiline strings, using “
> 2) your triple quote sort of string, specifically tuned to avoid having to 
> escape “ when it occurs once or twice in sequence.
> 3) heredoc, which is a very general (but also very heavy weight) solution to 
> quoting problems.
> 
> I’m trying to eliminate the middle one, so we only have to have "two things”. 
>  Here are some alternative ways to solve the problem, which might have less 
> of an impact on the language:
> 
> A) Introduce single quoted string literals to avoid double quote problems 
> specifically, e.g.:   ‘look “here” I say!’.  This is another form of #2 which 
> is less ugly.  It also doesn’t help you if you have both “ and ‘ in your 
> string.
> 
> B) Introduce a modifier character that requires a more complex closing 
> sequence to close off the string, see C++ raw string literals for prior art 
> on this approach.  Perhaps something like:
> 
>        Rxxx”look “ here “ I can use quotes “xxx
> 
> That said, I still prefer C) "ignore this issue for now”.  In other words, I 
> wouldn’t want to block progress on improving the string literal situation 
> overall on this issue, because anything we do here is an further extension to 
> a proposal that doesn’t solve this problem.
> 
>> 
>>> 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).
>> 
>> There are two questions and a suggestion I have whenever heredoc syntax 
>> comes up.
>> 
>> Q1: Does the heredoc begin immediately, at the next line, or at the next 
>> valid place for a statement to start? Heredocs traditionally take the second 
>> approach.
>> 
>> Q2: Do you permit heredocs to stack—that is, for a single line to specify 
>> multiple heredocs?
>> 
>> S: During the Perl 6 redesign, they decided to use the delimiter's 
>> indentation to determine the base indentation for the heredoc:
>> 
>>      func x() -> String {
>>              return <<EOF
>>              <?xml version="1.0"?>
>>              <catalog>
>>              \t<book id="bk101" empty="">
>>              \t\t<author>\(author)</author>
>>              \t</book>
>>              </catalog>
>>              EOF
>>      }
>> 
>> Does that seem like a good approach?
> 
> I think that either approach could work, that you have a lot more experience 
> on these topics than I do, and I would expect a vigorous community debate 
> about these topics. :-)
> 
> That said, if you look at what we’re discussing:
> 
> 1. “Continuation" string literals, to allow a multi-line string literal.  You 
> and I appear to completely agree about this.
> 2. Heredoc: You and I seem to agree that they are a good “fully general” 
> solution to have, but there are the details you outline above to iron out.
> 3. Modifier characters:  I’m in favor, but I don’t know where you stand.  
> There is also still much to iron out here (such as the specific characters).
> 4. A way to avoid having to escape “ in a non-heredoc literal.  I’m still 
> unconvinced, and think that any solution to this problem will be orthogonal 
> to the problems solved by 1-3 (and therefore can be added after getting 
> experience with the other parts).
> 
> If you agree that these are all orthogonal pieces, then treat them as such: 
> I’d suggest that you provide a proposal that just tackles the continuation 
> string literals.  This seems simple, and possible to get in for Swift 3.  
> After that, we can discuss heredoc and modifiers (if you think they’re a good 
> solution) on their own threads.  If those turn out to be uncontroversial, 
> then perhaps they can get in too.
> 
> On the heredoc aspects specifically, unless others chime in with strong 
> opinions about the topics you brought up, I’d suggest that you craft a 
> proposal for adding them with your preferred solution to these.  You can 
> mention the other answers (along with their tradeoffs and rationale for why 
> you picked whatever you think is right) in the proposal, and we can help the 
> community hash it out.
> 
> What do you think?
> 
> -Chris
> 
> 
> 
> 
> 

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

Reply via email to