> On 12 Apr 2017, at 02:50, Xiaodi Wu via swift-evolution 
> <swift-evolution@swift.org> wrote:
> 
>> On Tue, Apr 11, 2017 at 7:32 PM, Brent Royal-Gordon via swift-evolution 
>> <swift-evolution@swift.org> wrote:
>> 
>>> 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.
> 
> Brent, excellent job revising the proposal text. My question for you and the 
> other authors is the other way around: what is the rationale behind only 
> stripping the leading newline and not the trailing newline? While in many 
> cases a trailing newline is not harmful or even beneficial, if you trim the 
> one, wouldn't it make sense to trim the other? Wouldn't it make the rules 
> easier to explain to users too? For instance:
> 
> '''
> Hello, world!
> '''
> 
> could instead be a one-line string "Hello, world!"
> 
> And those who need the trailing newline can trivially insist on it:
> 
> '''
> Hello, world!
> 
> '''

I second Xiaodi's remark. I would prefer it if the trailing new line was 
escaped too. It would make more sense and is what people would logically expect 
IMHO.
>>> 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