I’d be fine with that.

-Thorsten


> Am 12.04.2017 um 12:59 schrieb Adrian Zubarev via swift-evolution 
> <swift-evolution@swift.org>:
> 
> One last pitch, can we allow comments in multi-line strings if the string is 
> broken up by a backslash?
> 
> 
> let myString = """
>     text text  
>     text text text \ // Comment allowed in the current line here, but not in 
> the line above it
>     text text text \ /* this type of comment is fine too */
>     text text\// notice whitespace can be ignored
>     """
> You might have some interpolation and want to comment around it.
> 
> let foo = """
>     bar bar bar
>     bar \(x) bar\ // `x` does some magic
>     """
> 
> 
> 
> -- 
> Adrian Zubarev
> Sent with Airmail
> 
> Am 12. April 2017 um 12:48:57, Adrian Zubarev 
> (adrian.zuba...@devandartist.com <mailto:adrian.zuba...@devandartist.com>) 
> schrieb:
> 
>> Actually I’m fine with such a compromise. Such a model has everything we’ve 
>> asked for, it’s easy, it has both leading and trailing precision and 
>> implicit new lines where needed.
>> 
>> 
>> 
>> -- 
>> Adrian Zubarev
>> Sent with Airmail
>> 
>> Am 12. April 2017 um 12:42:17, Vladimir.S via swift-evolution 
>> (swift-evolution@swift.org <mailto:swift-evolution@swift.org>) schrieb:
>> 
>>> On 12.04.2017 13:16, Thorsten Seitz via swift-evolution wrote:
>>> >> Am 12.04.2017 um 10:11 schrieb Adrian Zubarev via swift-evolution
>>> >> <swift-evolution@swift.org <mailto:swift-evolution@swift.org> 
>>> >> <mailto:swift-evolution@swift.org <mailto: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
>>> 
>>> Yes, I also think the single line string can be very useful and we should 
>>> not
>>> disallow it.
>>> 
>>> But I agree that we should disallow multi-line cases when we have text on 
>>> the same
>>> line with leading or trailing """ because this complicates the mental modal 
>>> and adds
>>> confusion points.
>>> 
>>> I.e. I suggest to allow only two forms:
>>> 1. Single line: """this is "just" text""" (no line end will be inserted)
>>> 2. Multiline, where leading and trailing """ has no text after/before them 
>>> and *all*
>>> the text is in lines *between* triple quotes:
>>> """
>>> first line
>>> second line
>>> """
>>> 
>>> One can use backslash at the line end to emulate all other needed cases. 
>>> Like:
>>> 
>>> """
>>> first line \
>>> second line\
>>> """
>>> 
>>> will produce "first line second line"
>>> 
>>> >
>>> >> |"""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 <mailto:br...@architechies.com>
>>> >> <mailto:br...@architechies.com <mailto:br...@architechies.com>>) schrieb:
>>> >>
>>> >>>
>>> >>>> On Apr 11, 2017, at 8:08 AM, Adrian Zubarev via swift-evolution
>>> >>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org> 
>>> >>>> <mailto:swift-evolution@swift.org <mailto: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 <mailto:swift-evolution@swift.org> 
>>> >> <mailto:swift-evolution@swift.org <mailto:swift-evolution@swift.org>>
>>> >> https://lists.swift.org/mailman/listinfo/swift-evolution 
>>> >> <https://lists.swift.org/mailman/listinfo/swift-evolution>
>>> >
>>> >
>>> >
>>> > _______________________________________________
>>> > swift-evolution mailing list
>>> > swift-evolution@swift.org <mailto:swift-evolution@swift.org>
>>> > https://lists.swift.org/mailman/listinfo/swift-evolution 
>>> > <https://lists.swift.org/mailman/listinfo/swift-evolution>
>>> >
>>> _______________________________________________
>>> swift-evolution mailing list
>>> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
>>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
>> 
> 
> 
> _______________________________________________
> swift-evolution mailing list
> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
> https://lists.swift.org/mailman/listinfo/swift-evolution 
> <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