> On 21 Apr 2017, at 20:20, Xiaodi Wu <xiaodi...@gmail.com> wrote:
> 
>> On Fri, Apr 21, 2017 at 8:45 AM, David Hart <da...@hartbit.com> wrote:
>> 
>>> On 21 Apr 2017, at 11:32, Adrian Zubarev via swift-evolution 
>>> <swift-evolution@swift.org> wrote:
>>> 
>>> Dear Xiaodi Wu, why do you always have to be offensive in a way of 
>>> questioning every single word another person says and not letting others to 
>>> have their own opinion?! I do not want to have a discussion with you that 
>>> will and up you asking me why is the banana crooked. I expect a focused and 
>>> a constructive discussion if not mentioned otherwise.
>>> 
>>> My expectation from the model of the multi-lined string literal might be 
>>> different from yours and you’ll have to bear with that, because I’ve got my 
>>> own opinion. If you’d like me to see things differently, try to convince me 
>>> instead of being unfocused and questioning every single word I’m saying. 
>>> That won’t lead use to anywhere.
>>> 
>> 
>> Hi Adrian. For what it's worth, I did not detect any offense in Xiaodi’s 
>> questions. I think he was just asking questions to point parts of your 
>> opinion which he did not understand or was missing some reasoning.
> 
> Yes, that was my intention.
>  
>>> I expect the model to solve two major problems. The first one is already 
>>> solved by the accepted version. The second one is the ability to escape new 
>>> lines when needed (notice, I do not want to escape them all the time, but 
>>> only where it’s desired). The accepted version adds more possibilities to 
>>> the language and will definitely fix a lot of pain with string literals 
>>> some developer had. I’m happy to see that. However from my personal 
>>> standpoint, I do not write any code generators created from string literals 
>>> as it was a heavily overused example in the proposal and during the 
>>> discussion. I often need the ability to wrap very long strings into 
>>> multiple lines for readability, but keep the result string intact. In my 
>>> last response I showed a sample on how it might look like and that it’s 
>>> really painful to read such a string on Git, because it does not provide 
>>> any soft-wrapping like other tools might do. That is why I keep saying that 
>>> the multi-line string literal should not rely on editors to solve that 
>>> problem. Otherwise the bare existence of the such literal could be 
>>> questioned and we could fully fall back to editor features like 
>>> soft-wrapping or let the editor also wrap strings when it finds a new line 
>>> character \n to mimic the proposed behavior. I also do not like the 
>>> argument of using string concatenation to solve my particular issue, 
>>> because the strings are very long and it quickly becomes were tedious. 
>>> Furthermore, the multi-line string literal should not be only reserved for 
>>> solving the problems you’ve mentioned. A trailing backslash does not add 
>>> any complexity, and you personally don’t need that feature it does not mean 
>>> that others won’t need it. It’s an additional feature which is lightweight 
>>> and which won’t harm the copy-paste phenomenon most of you wanted. If you 
>>> really think it adds complexity than you should also justify your thoughts 
>>> to convince your conversation partner. 
>>> 
>>> IMHO ‘complexity’ creates ‘flexibility’. If we’d only had one access 
>>> modifier in Swift the model would be really simple but not flexible. Not 
>>> that we have a bunch of them the model become complex but on the other hand 
>>> it also become way more flexible.
>>> 
>> 
>> But for what its worth, I agree with Adrian. Let me try to expose the 
>> use-case the proposal is not addressing:
>> 
>> A group of people (me included) don’t wrap lines in their editor (by choice) 
>> but make sure that lines of code don’t extend over a certain limit (80, 100, 
>> 120, whatever). This allows us to keep code readable and control the 
>> wrapping behaviour by manually applying it.
>> 
>> For those people, writing long prose which extends over our limit (like is 
>> the case in some error/assert/precondition messages), we won’t be able to 
>> use the multi-line string proposal and we will have to stay with string 
>> concatenation:
> 
> But the key questions I asked are still unanswered:
> 
> - What is wrong with string concatenation? Why is that not the ideal 
> solution? A key motivation for this particular proposal was that it will 
> allow you to copy and paste content with newlines into a string. But here, 
> you are explicitly wrapping a string without newlines for the purposes of 
> formatting your own code. Surely, that can be just as easily done by writing 
> `"+"` as it is by writing `\`, no?

The reason I'm bothered about string concatenation is that it's not as easily 
maintainable. For example, imagine I modify some text in one of the segments 
(before the last). I have to re-evaluate where the separation will go and do 
more editing than with \.

> - What does this use case have to do with _multiline_ strings? Put another 
> way, why are you in support of a syntax for line continuation, but only for 
> _multiline_ string literals? [Looking back, I guess this echoes one of the 
> core team's issues with it as well.] In your examples, you're demonstrating 
> that it's very useful for generating _single-line_ strings. If this is a 
> common use and important use case, shouldn't we be designing a way to make 
> this work with _single-line string literals_?

The only link with multi-line string with my example is that we are choosing to 
format it over multiple lines of source code. But of course, I wouldn't be 
against a special syntax of single-line strings to solve the same problem:

assert(condition, "A single-line string over multiple lines
    could look like this - new lines are ignored")

> One argument left unsaid here, but which I guess I'll state explicitly: in 
> the decisions that they have taken on review, the core team has, afaict, 
> shown that they want to design "multiline string literals" in such a way that 
> a multiline (string literal) is the preferred way of spelling a (multiline 
> string) literal, and that the latter should be the principal use for the 
> former. I think this is both wise and worthy of preservation, unless there is 
> some very strong countervailing reason.
> 
> But anyway, we are getting far afield here. I don't feel particularly 
> strongly about `\` as a feature here. But I do believe that making trailing 
> whitespaces at the end of a line a compiler warning or error is not the way 
> to go. Either your style is to strip those out and you already have tools to 
> enforce that, or it isn't your style and the compiler shouldn't force you to. 
> The idea that it must be possible to visually inspect a string and know what 
> characters are contained in it is not only unhelpful but dangerous: with 
> Unicode, this "inspectability" can never be guaranteed, and making gestures 
> at solving only one particular example of the issue would encourage users to 
> rely on visual inspection of strings when they absolutely should not.
> 
>> Taking the following piece of code:
>> 
>> func myFunction() {
>>     assert(aVariable > 10 && anotherVariable < 50, “Variables `aVariable` 
>> and `anotherVariable` are outside their expected range. Please check that 
>> your are not calling this function around midnight”)
>> }
>> 
>> I currently write it using string concatenation:
>> 
>> fun myFunction() {
>>     assert(aVariable > 10 && anotherVariable < 50, "Variables `aVariable` 
>> and `anotherVariable` " +
>>         "are outside their expected range. Please check that your are not 
>> calling this function " +
>>         "around midnight")
>> }
>> 
>> But writing it using the multi-line string syntax:
>> 
>> fun myFunction() {
>>     assert(aVariable > 10 && anotherVariable < 50, """Variables `aVariable` 
>> and `anotherVariable` 
>>      are outside their expected range. Please check  that your are not 
>> calling this function 
>>      around midnight
>>         """)
>> }
>> 
>> will inject unwanted newlines. I think what we would like to be able to do 
>> is:
>> 
>> fun myFunction() {
>>     assert(aVariable > 10 && anotherVariable < 50, """Variables `aVariable` 
>> and `anotherVariable` \
>>      are outside their expected range. Please check  that your are not 
>> calling this function \
>>      around midnight
>>         """)
>> }
>> 
>> Notice how the space at the end of the line is also quite obvious now.
>> 
>>> -- 
>>> Adrian Zubarev
>>> Sent with Airmail
>>> 
>>> Am 20. April 2017 um 21:50:27, Xiaodi Wu (xiaodi...@gmail.com) schrieb:
>>> 
>>>> On Thu, Apr 20, 2017 at 11:48 AM, Adrian Zubarev 
>>>> <adrian.zuba...@devandartist.com> wrote:
>>>>> The multi-line string literal as it’s accepted right now only allows 
>>>>> pretty code generation with smaller lines.
>>>>> 
>>>> 
>>>> This statement does not make sense to me. Multiline string literals allow 
>>>> (with the unavoidable exception of some escape sequences) code written 
>>>> inside the quotations marks to be exactly as pretty as the resulting 
>>>> string itself. That is why it's a literal.
>>>> 
>>>>> The literal itself is not reserved for JSON, XML and similar syntaxes 
>>>>> only, which automatically implies the existence of conventions with 
>>>>> longer lines. For whatever reasons a developer might have, it’s essential 
>>>>> to allow manual line wrapping without injecting a new line into the 
>>>>> resulting string.
>>>>> 
>>>> 
>>>> You keep re-stating instead of explaining why you think this is essential. 
>>>> What are the "whatever reasons" for a developer to need this feature? It 
>>>> is critical enough to be worth complicating the design for something like 
>>>> literal syntax, which should be as lightweight, straightforward, and 
>>>> simple as possible?
>>>> 
>>>>> Not everyone uses the same editor width nor the same editor with exact 
>>>>> the same settings.
>>>>> 
>>>> 
>>>> Do you think it is a common use case that someone will want to have text 
>>>> that looks the same only to people reading the code, but not to people 
>>>> reading the resulting string? Do you think someone might want to put code 
>>>> inside a string literal, then wrap the literal using 80-character lines, 
>>>> but write the code inside to wrap using 120-character lines? These seem 
>>>> like rather implausible use cases.
>>>> 
>>>>> You simply cannot and really should not rely on any editor or linter for 
>>>>> that matter,
>>>>> 
>>>> 
>>>> If you are going to view a Swift file, you're going to do it through some 
>>>> program or other. Is it reasonable to add features to Swift because some 
>>>> hypothetical text editors might not be able to wrap lines? 
>>>> 
>>>>> nor do I vision it as a strong argument against having the ability to 
>>>>> escape the new line injection. I don’t think we should ever expect the 
>>>>> average Swift developer sitting in-front of an ultra wide monitor.
>>>>> 
>>>>> Consider this example:
>>>>> 
>>>>> // Currently it would look like this:
>>>>> 
>>>>> let myLongString = "Ut wisi enim ad minim veniam, quis nostrud exerci 
>>>>> tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo 
>>>>> consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate 
>>>>> velit esse molestie consequat, vel illum dolore eu feugiat nulla 
>>>>> facilisis at vero eros et accumsan et iusto odio dignissim qui blandit 
>>>>> praesent luptatum zzril delenit augue duis dolore te feugait nulla 
>>>>> facilisi.\n\nNam liber tempor cum soluta nobis eleifend option congue 
>>>>> nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem 
>>>>> ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh 
>>>>> euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi 
>>>>> enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit 
>>>>> lobortis nisl ut aliquip ex ea commodo consequat.\n\nDuis autem vel eum 
>>>>> iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel 
>>>>> illum dolore eu feugiat nulla facilisis."
>>>>> 
>>>>> // With the accepted version of the proposal it becomes a little bit 
>>>>> better, but still to long,
>>>>> // because we can only replace `\n` characters with lines and that's it.
>>>>> 
>>>>> let myLongString = """
>>>>>    Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper 
>>>>> suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel 
>>>>> eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, 
>>>>> vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et 
>>>>> iusto odio dignissim qui blandit praesent luptatum zzril delenit augue 
>>>>> duis dolore te feugait nulla facilisi.   
>>>>> 
>>>>>    Nam liber tempor cum soluta nobis eleifend option congue nihil 
>>>>> imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum 
>>>>> dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh 
>>>>> euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi 
>>>>> enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit 
>>>>> lobortis nisl ut aliquip ex ea commodo consequat.   
>>>>> 
>>>>>    Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse 
>>>>> molestie consequat, vel illum dolore eu feugiat nulla facilisis.   
>>>>>    """
>>>>> 
>>>>> // This is how it should ideally look like and be editor/IDE/linter 
>>>>> independent.   
>>>>> // The string produces the same result as above and does not rely on any  
>>>>>  
>>>>> // soft-wrapping functionality
>>>> 
>>>> Why should one not rely on editors being able to soft wrap? Which editors 
>>>> cannot soft wrap? What is wrong with soft wrapping?
>>>>  
>>>>>  and is written within some smaller line width.
>>>>> // The trailing precision is a really good tradeoff at this point.
>>>>> 
>>>>> let myLongString = """
>>>>>    Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper 
>>>>> suscipit \
>>>>>    lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum 
>>>>> iriure \
>>>>>    dolor in hendrerit in vulputate velit esse molestie consequat, vel 
>>>>> illum dolore \
>>>>>    eu feugiat nulla facilisis at vero eros et accumsan et iusto odio 
>>>>> dignissim qui \
>>>>>    blandit praesent luptatum zzril delenit augue duis dolore te feugait 
>>>>> nulla facilisi.   
>>>>>      
>>>>>    Nam liber tempor cum soluta nobis eleifend option congue nihil 
>>>>> imperdiet doming \
>>>>>    id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, 
>>>>> consectetuer \
>>>>>    adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet 
>>>>> dolore magna \
>>>>>    aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud 
>>>>> exerci tation \
>>>>>    ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. 
>>>>>   
>>>>> 
>>>>>    Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse 
>>>>> molestie \
>>>>>    consequat, vel illum dolore eu feugiat nulla facilisis.
>>>>>    """
>>>>> The string concatenation uses optimization magic behind the scenes which 
>>>>> is not obvious for everyone.
>>>>> 
>>>> 
>>>> What is magic about string concatenation?
>>>>  
>>>>> I personally think that every operation involved in concatenation or any 
>>>>> operation in-general adds a performance overhead
>>>>> 
>>>> 
>>>> In what scenarios have you encountered runtime performance bottlenecks due 
>>>> to concatenation of string literals?
>>>>  
>>>>> and theoretically needs more time to resolve the expression at runtime, 
>>>>> which is the natural way of thinking without any knowledge
>>>>> 
>>>> 
>>>> Why should we add new features simply because people who "think without 
>>>> any knowledge" might have misunderstandings about existing ones?
>>>>  
>>>>> about the optimization the compiler is able to do for you. A string 
>>>>> literal is able to solve that issue during compile time is simply the 
>>>>> perfect place for that.
>>>>> 
>>>> 
>>>> 
>>>>  
>>>>> 
>>>>> Some words about the trailing precision. Joe said that we could use \("") 
>>>>> as workaround, but if I recall correctly literals are banned from the 
>>>>> interpolation itself, which will result in us doing something like this:
>>>>> 
>>>>> let end = ""
>>>>> 
>>>>> let myString = """
>>>>>    <space><space>foo<space><space>\(end)
>>>>>    """
>>>>> This is a very dirty and tedious solution for that problem.
>>>>> 
>>>>> As accepted right now, no one should ever expect the result string to 
>>>>> include any whitespace characters at the end of each line unless there is 
>>>>> a visible annotation provided for precision.
>>>>> 
>>>> 
>>>> Why shouldn't they? I expect nothing about line endings with the current 
>>>> accepted design. Why should I expect literal whitespace to be visibly 
>>>> annotated? I expect them to be, um, whitespace.
>>>> 
>>>>> Providing a warning for trailing whitespace characters would be ideal 
>>>>> solution right now and the trailing backslash becomes additive but not 
>>>>> impossible to add later.
>>>>> 
>>>>> A few people already argued that the core team decided not to include a 
>>>>> new line at the end of each multi-line string, where you yourself said 
>>>>> that the absence of a trailing backslash will produce a string which 
>>>>> always ends with a new line. That behavior would be really strange and 
>>>>> painful to prevent if there is no backslash for escaping it.
>>>>> 
>>>>> The trailing backslash does not add any complexity but instead it adds 
>>>>> more flexibility to the literal model, which results in better 
>>>>> readability if the precision is desired for code formatting!
>>>>> 
>>>>> 
>>>>> 
>>>>> -- 
>>>>> Adrian Zubarev
>>>>> Sent with Airmail
>>>>> 
>>>>> Am 20. April 2017 um 07:30:29, Xiaodi Wu (xiaodi...@gmail.com) schrieb:
>>>>> 
>>>>>> You can use a plain text editor and no linter, or a plain text editor 
>>>>>> and a linter, or an IDE and no linter, etc., and in any of these 
>>>>>> scenarios you can already choose whether or not you want trailing 
>>>>>> newlines stripped. Why should the compiler try to enforce any rules here?
>>>>>> 
>>>>>> Since Unicode is supported, it is never possible to look at a string 
>>>>>> literal and be 100% sure of what glyphs are involved. We should be clear 
>>>>>> that such a criterion cannot and should not be a design goal. If it 
>>>>>> supports Unicode and is really literal, then confusables and invisibles 
>>>>>> will make it impossible to be sure of what you see; you would have to 
>>>>>> either stop supporting Unicode or stop being literal.
>>>>>> 
>>>>>> I'm not sure this "coding style" you describe can properly be thought of 
>>>>>> as a multiline string literal. It sounds like what you want isn't 
>>>>>> multiline (in fact, you want a new way to write a very long single-line 
>>>>>> string) and it isn't literal (you want to use newlines in your code that 
>>>>>> do not represent a literal newline). If there is something extremely 
>>>>>> critical about a particular string, where you simply must start half of 
>>>>>> it on a separate line to help the readers of your code understand what 
>>>>>> you are doing, you can already do this by writing "foo" + [newline] 
>>>>>> "bar". Or you could just let your editor soft-wrap your long string. 
>>>>>> Making your single-line string wrap the same way in every IDE just 
>>>>>> doesn't seem like it's related to or worth complicating the syntax for 
>>>>>> multiline string literals. I would be strongly opposed to such a feature.
>>>>>> 
>>>>>> 
>>>>>>> On Wed, Apr 19, 2017 at 23:42 Adrian Zubarev via swift-evolution 
>>>>>>> <swift-evolution@swift.org> wrote:
>>>>>>> True, but this is not about IDEs or editors. The feature itself doesn’t 
>>>>>>> know what an editor is and what it capable of, nor should be ever rely 
>>>>>>> on that. Not everyone uses the same settings and you cannot be 100% 
>>>>>>> sure to expect the same string from looking at it, which was written in 
>>>>>>> a different editor if we don’t warn about trailing whitespaces now.
>>>>>>> 
>>>>>>> The trailing whitespaces might not do any harm for the currently 
>>>>>>> accepted version, but we’ll have to warn about them if we decide to add 
>>>>>>> the trailing backspace. As currently accepted we still have a hole to 
>>>>>>> fill for coding styles, we do not support multi-lined string literals 
>>>>>>> for code formatting only, nor do we have trailing precision for the 
>>>>>>> same matter. (That’s what the backslash was meant for.) That said, I 
>>>>>>> cannot break up a really long hardcoded string, which in my IDE is 
>>>>>>> softly wrapped, into a multi-line string literal so that it looks in 
>>>>>>> every editor the same and still expect the same result and be precise 
>>>>>>> about the trailing whitespace characters.
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>> -- 
>>>>>>> Adrian Zubarev
>>>>>>> Sent with Airmail
>>>>>>> 
>>>>>>> Am 20. April 2017 um 00:27:48, Brent Royal-Gordon via swift-evolution 
>>>>>>> (swift-evolution@swift.org) schrieb:
>>>>>>> 
>>>>>>>>>> On Apr 19, 2017, at 3:18 PM, Xiaodi Wu via swift-evolution 
>>>>>>>>>> <swift-evolution@swift.org> wrote:
>>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>>> Other common tools like Git already flag trailing whitespace by 
>>>>>>>>>> default, so even if Swift doesn't warn about it, you might still 
>>>>>>>>>> need to satisfy other tools in your pipeline.
>>>>>>>>> 
>>>>>>>>> Isn't that an equally good argument for Swift *not* warning you about 
>>>>>>>>> it? If it's harmful, you'll have other tools in the pipeline to flag 
>>>>>>>>> it for you.
>>>>>>>> 
>>>>>>>> 
>>>>>>>> Cosigned. We already have an Xcode setting to strip trailing 
>>>>>>>> whitespace, a Git setting to flag it, and linter settings to remove 
>>>>>>>> it. (For instance, SwiftFormat has a --trimwhitespace flag.) Not every 
>>>>>>>> tool needs to handle every case of questionable style.
>>>>>>>> 
>>>>>>>> -- 
>>>>>>>> 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
>> 
> 
_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to