On Apr 12, 2017, at 6:20 PM, Brent Royal-Gordon via swift-evolution 
<[email protected] <mailto:[email protected]>> wrote:

> Wow, maybe I shouldn't have slept.

LOL. 

My thoughts so far:

• If and only if the opening """ is followed by a newline then strip it.
• Don't strip the trailing newline.

Example:

        print( """
            Usage: myapp <options>
            
            Run myapp to do mything
            
            Options:
            -myoption - an option
            """ )

Additionally, allow the string to start immediately after the opening """.  In 
this scenario the indentation stripping is performed starting with the second 
line:

        case .isExprSameType(let from, let to):
                return """checking a value with optional type \(from) \
                          against dynamic type \(to) \
                          succeeds whenever the value is non-'nil'; \
                          did you mean to use '!= nil'?\
                          """

And definitely something like this too:

let html = """<a href="\(url)" id="link\(i)" class="link">"""

Again, the string literal is allowed to start immediately after the opening 
""".  And No newline stripping is required here because the closing """ is not 
on a line by itself.


> Okay, let's deal with trailing newline first. I'm *very* confident that 
> trailing newlines should be kept by default. This opinion comes from lots of 
> practical experience with multiline string features in other languages. In 
> practice, if you're generating files in a line-oriented way, you're usually 
> generating them a line at a time. It's pretty rare that you want to generate 
> half a line and then add more to it in another statement; it's more likely 
> you'll interpolate the data. I'm not saying it doesn't happen, of course, but 
> it happens a lot less often than you would think just sitting by the fire, 
> drinking whiskey and musing over strings.
> 
> I know that, if you're pushing for this feature, it's not satisfying to have 
> the answer be "trust me, it's not what you want". But trust me, it's not what 
> you want.
> 
> Moving to the other end, I think we could do a leading newline strip *if* 
> we're willing to create multiline and non-multiline modes—that is, newlines 
> are _not allowed at all_ unless the opening delimiter ends its line and the 
> closing delimiter starts its line (modulo indentation). But I'm reluctant to 
> do that because, well, it's weird and complicated. I also get the feeling 
> that, if there's a single-line mode and a multi-line mode, we ought to treat 
> them as truly orthogonal features and allow `"`-delimited strings to use 
> multi-line mode, but I'm really not convinced that's a good idea.
> 
> (Note, by the way, that heredocs—a *really* common multiline string 
> design—always strip the leading newline but not the trailing one.)
> 
> Adrian cited this example, where I agree that you really don't want the 
> string to be on the same line as the leading delimiter:
> 
>       let myReallyLongXMLConstantName = """<?xml version="1.0"?>
>                                            <catalog>
>                                               <book id="bk101" empty="">
>                                                  <author>John Doe</author>
>                                                  <title>XML Developer's 
> Guide</title>
>                                                  <genre>Computer</genre>
>                                                  <price>44.95</price>
>                                               </book>
>                                            </catalog>\
>                                            """        
> 
> But there are lots of places where it works fine. Is there a good reason to 
> force an additional newline in this?
> 
>                       case .isExprSameType(let from, let to):
>                               return """checking a value with optional type 
> \(from) against dynamic type \(to) \
>                                             succeeds whenever the value is 
> non-'nil'; did you mean to use '!= nil'?\
>                                             """
> 
> I mean, we certainly could, but I'm not convinced we should. At least, not 
> yet.
> 
> In any case, trailing newline definitely stays. Leading newline, I'm still 
> thinking about.
> 
> As for other things:
> 
> * I see zero reason to fiddle with trailing whitespace. If it's there, it 
> might be significant or it might not be. If we strip it by default and we 
> shouldn't, the developer has no way to protect it. Let's trust the developer. 
> (And their tooling—Xcode, I believe Git, and most linters already have 
> trailing whitespace features. We don't need them too.)
> 
> * Somebody asked about `"""`-delimited heredocs. I think it's a pretty 
> syntax, but it's not compatible with single-line use of `"""`, and I think 
> that's probably more important. We can always add heredocs in another way if 
> we decide we want them. (I think `#to(END)` is another very Swifty syntax we 
> could use for heredocs--less lightweight, but it gives us a Google-able 
> keyword.)
> 
> * Literal spaces and tabs cannot be backslashed. This is really important 
> because, if you see a backslash after the last visible character in a line, 
> you can't tell just by looking whether the next character is a space, tab, or 
> newline. So the solution is, if it's not a newline, it's not valid at all.
> 
> I'll respond to Jarod separately.
> 
>> On Apr 12, 2017, at 12:07 PM, John Holdsworth <[email protected] 
>> <mailto:[email protected]>> wrote:
>> 
>> Finally.. a new Xcode toolchain 
>> <http://johnholdsworth.com/swift-LOCAL-2017-04-12-a-osx.tar.gz> is available 
>> largely in sync with the proposal as is.
>> (You need to restart Xcode after selecting the toolchain to restart 
>> SourceKit)
>> 
>> I personally am undecided whether to remove the first line if it is empty. 
>> The new
>> rules are more consistent but somehow less practical. A blank initial line 
>> is almost
>> never what a user would want and I would tend towards removing it 
>> automatically.
>> This is almost what a user would it expect it to do.
>> 
>> I’m less sure the same applies to the trailing newline. If this is a syntax 
>> for
>> multi-line strings, I'd argue that they should normally be complete lines -
>> particularly since the final newline can so easily be escaped.
>> 
>>         let longstring = """\
>>             Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do 
>> eiusmod \
>>             tempor incididunt ut labore et dolore magna aliqua. Ut enim ad 
>> minim veniam, \
>>             quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea 
>> commodo consequat.\
>>             """
>> 
>>         print( """\
>>             Usage: myapp <options>
>>             
>>             Run myapp to do mything
>>             
>>             Options:
>>             -myoption - an option
>>             """ )
>> 
>> (An explicit “\n" in the string should never be stripped btw)
>> 
>> Can we have a straw poll for the three alternatives:
>> 
>> 1) Proposal as it stands  - no magic removal of leading/training blank lines.
>> 2) Removal of a leading blank line when indent stripping is being applied.
>> 3) Removal of leading blank line and trailing newline when indent stripping 
>> is being applied.
>> 
>> My vote is for the pragmatic path: 2)
>> 
>> (The main intent of this revision was actually removing the link between how 
>> the
>> string started and whether indent stripping was applied which was 
>> unnecessary.)
>> 
>>> On 12 Apr 2017, at 17:48, Xiaodi Wu via swift-evolution 
>>> <[email protected] <mailto:[email protected]>> wrote:
>>> 
>>> Agree. I prefer the new rules over the old, but considering common use 
>>> cases, stripping the leading and trailing newline makes for a more pleasant 
>>> experience than not stripping either of them.
>>> 
>>> I think that is generally worth prioritizing over a simpler algorithm or 
>>> even accommodating more styles. Moreover, a user who wants a trailing or 
>>> leading newline merely types an extra one if there is newline stripping, so 
>>> no use cases are made difficult, only a very common one is made more 
>>> ergonomic.
>> 
> 
> -- 
> Brent Royal-Gordon
> Architechies
> 
> _______________________________________________
> swift-evolution mailing list
> [email protected] <mailto:[email protected]>
> https://lists.swift.org/mailman/listinfo/swift-evolution 
> <https://lists.swift.org/mailman/listinfo/swift-evolution>
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to