I agree. That would be very useful. 

> On Apr 12, 2017, at 6:16 AM, Thorsten Seitz via swift-evolution 
> <swift-evolution@swift.org> wrote:
> 
>> Am 12.04.2017 um 10:11 schrieb Adrian Zubarev via swift-evolution 
>> <swift-evolution@swift.org>:
>> 
>> Great explanation thank you Brent. I’m convinced about the closing delimiter 
>> now. =)
>> 
>> If I understood correctly what Xiaodi Wu meant in his reply, then we could 
>> simplify the whole multi-line string literal and also remove the need of 
>> disabling the stripping algorithm.
>> 
>> We should ban these examples completely:
>> 
>> """Hello·world!"""
>> 
> 
> Being able to use ""“ for single line strings containing lots of " is useful 
> in itself and explained in the motivational section of the proposal:
> 
> "Tripled string literals can also do double duty as a syntax for handling 
> short string literals with many internal quotation marks“
> 
> -Thorsten
> 
>> """Hello↵
>> world!"""
>> """Hello↵
>> world!↵
>> """
>> """↵
>> Hello↵
>> world!"""
>> Instead an empty multi-line string literal would look like this:
>> 
>> """↵
>> """
>> To fix the above example you’d need to write it like this:
>> 
>> """↵
>> Hello·world!\↵
>> """
>> """↵
>> Hello↵
>> world!\↵
>> """
>> Each line in between the delimiters would add implicit new lines if not 
>> disabled by a backslash.
>> The trailing precision is also handled by the backslash.
>> The indent is handled by the closing delimiter.
>> It’s easier to learn/teach.
>> It’s easier to read, because most of the time the line where the starting 
>> delimiter is, is filled with some other code.
>> let myString = """↵
>> ⇥  ⇥  Hello↵
>> ⇥  ⇥  world!\↵
>> ⇥  ⇥  """
>> Now that would be a true multi-line string literal which needs at least two 
>> lines of code. If you’d need a single line literal, "" is the obvious pick.
>> 
>> 
>> 
>> 
>> -- 
>> Adrian Zubarev
>> Sent with Airmail
>> 
>> Am 12. April 2017 um 02:32:33, Brent Royal-Gordon (br...@architechies.com) 
>> schrieb:
>> 
>>> 
>>>> On Apr 11, 2017, at 8:08 AM, Adrian Zubarev via swift-evolution 
>>>> <swift-evolution@swift.org> wrote:
>>>> 
>>>> That’s also the example that kept me thinking for a while.
>>>> 
>>>> Overall the proposal is a great compromise to some issues I had with the 
>>>> first version. However I have a few more questions:
>>>> 
>>>> Why can’t we make it consistent and let the compiler add a new line after 
>>>> the starting delimiter.
>>>> 
>>>> let string = """↵
>>>>     Swift↵
>>>>     """
>>>> 
>>>> // result
>>>> ↵Swift↵
>>>> If one would would the behavior from the proposal it’s really easy to add 
>>>> a backslash after the starting delimiter.
>>>> 
>>>> 
>>>> let string = """\↵
>>>>     Swift\↵
>>>>     """
>>>> 
>>>> // result
>>>> Swift
>>>> This would be consistent and less confusing to learn.
>>>> 
>>> That would mean that code like this:
>>> 
>>> print("""
>>> A whole bunch of 
>>> multiline text
>>> """)
>>> print("""
>>> A whole bunch more 
>>> multiline text
>>> """)
>>> 
>>> Will print (with - to indicate blank lines):
>>> 
>>> -
>>> A whole bunch of
>>> multiline text
>>> -
>>> -
>>> A whole bunch more
>>> multiline text
>>> -
>>> 
>>> This is, to a first approximation, never what you actually want the 
>>> computer to do.
>>>> Can’t we make the indent algorithm work like this instead?
>>>> let string = """\↵
>>>> ····<tag>↵
>>>> ······content text↵
>>>> ····</tag>""" // Indent starts with the first non space character
>>>> 
>>>> // result
>>>> 
>>>> <tag>↵
>>>> ··content text↵
>>>> </tag>
>>>> The line where the closing delimiter is trims all space chapters and the 
>>>> indent for the whole multi-line string is starting at the point where the 
>>>> first non-space chapters is in that line.
>>>> 
>>> We could; I discuss that briefly in the very last section, on alternatives 
>>> to the indentation stripping we specify:
>>> 
>>> • Stripping indentation to match the depth of the least indented line: 
>>> Instead of removing indentation to match the end delimiter, you remove 
>>> indentation to match the least indented line of the string itself. The 
>>> issue here is that, if all lines in a string should be indented, you can't 
>>> use indentation stripping. Ruby 2.3 does this with its heredocs, and 
>>> Python's dedent function also implements this behavior.
>>> 
>>> That doesn't quite capture the entire breadth of the problem with this 
>>> algorithm, though. What you'd like to do is say, "all of these lines are 
>>> indented four columns, so we should remove four columns of indentation from 
>>> each line". But you don't have columns; you have tabs and spaces, and 
>>> they're incomparable because the compiler can't know what tab stops you 
>>> set. So we'd end up calculating a common prefix of whitespace for all lines 
>>> and removing that. But that means, when someone mixes tabs and spaces 
>>> accidentally, you end up stripping an amount of indentation that is 
>>> unrelated to anything visible in your code. We could perhaps emit a warning 
>>> in some suspicious circumstances (like "every line has whitespace just past 
>>> the end of indentation, but some use tabs and others use spaces"), but if 
>>> we do, we can't know which one is supposed to be correct. With the proposed 
>>> design, we know what's correct—the last line—and any deviation from it can 
>>> be flagged *at the particular line which doesn't match our expectation*.
>>> 
>>> Even without the tabs and spaces issue, consider the case where you 
>>> accidentally don't indent a line far enough. With your algorithm, that's 
>>> indistinguishable from wanting the other lines to be indented more than 
>>> that one, so we generate a result you don't want and we don't (can't!) emit 
>>> a warning to point out the mistake. With the proposed algorithm, we can 
>>> notice there's an error and point to the line at fault.
>>> 
>>> Having the closing delimiter always be on its own line and using it to 
>>> decide how much whitespace to strip is better because it gives the compiler 
>>> a firm baseline to work from. That means it can tell you what's wrong and 
>>> where, instead of doing the dumb computer thing and computing a result 
>>> that's technically correct but useless.
>>>> PS: If we’d get this feature in Swift, it would be nice if Xcode and other 
>>>> IDEs which supports Swift could show space characters that are inside a 
>>>> string literal (not other space character <- which is already supported), 
>>>> so it would be easier to tell what’s part of the string and what is not.
>>>> 
>>> That would be very nice indeed. The prototype's tokenizer simply 
>>> concatenates together and computes the string literal's contents after 
>>> whitespace stripping, but in principle, I think it could probably preserve 
>>> enough information to tell SourceKit where the indentation ends and the 
>>> literal content begins. (The prototype is John's department, though, not 
>>> mine.) Xcode would then have to do something with that information, though, 
>>> and swift-evolution can't make the Xcode team do so. But I'd love to see a 
>>> faint reddish background behind tripled string literal content or a 
>>> vertical line at the indentation boundary.
>>> 
>>> In the meantime, this design *does* provide an unambiguous indicator of how 
>>> much whitespace will be trimmed: however much is to the left of the closing 
>>> delimiter. You just have to imagine the line extending upwards from there. 
>>> I think that's an important thing to have.
>>> 
>>> -- 
>>> Brent Royal-Gordon
>>> Architechies
>>> 
>> 
>> 
>> _______________________________________________
>> swift-evolution mailing list
>> swift-evolution@swift.org
>> https://lists.swift.org/mailman/listinfo/swift-evolution
> 
> _______________________________________________
> swift-evolution mailing list
> swift-evolution@swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution
_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to