From Joe's email: "[...] Discussion on the list raised the idea of allowing a line to end with \ to "escape" the newline and elide it from the value of the literal; the core team had concerns about only allowing that inside multi-line literals and felt that that could also be considered later as an additive feature. [...]"
So it sounds that can be considered in a separate proposal to be added to normal and multi-line string literals. > On Apr 21, 2017, at 2:57 PM, Xiaodi Wu via swift-evolution > <swift-evolution@swift.org> wrote: > >> On Fri, Apr 21, 2017 at 1:46 PM, David Hart <da...@hartbit.com> wrote: >> >>> 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 \. > > Hmm...the difficulty of editing hard-wrapped strings is principally due to > the hard-wrapping and not the delimiters, wouldn't you say? I've manually > re-wrapped my share of hard-wrapped text *without* delimiters, and it's > sufficiently a pain in the butt. Yes, there are three characters in `"+"` to > add or delete instead of the one in `\`, but the crux of the issue is the > hard-wrapping, which you're _choosing_ to do, wouldn't you agree? >>> - 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") > > And this is my point. If this feature is worth having, then whatever syntax > it goes by, it has nothing to do with multiline string literals and should > work for all string literals. It's simply not part and parcel of multiline > string literals. > >> >>> 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
_______________________________________________ swift-evolution mailing list swift-evolution@swift.org https://lists.swift.org/mailman/listinfo/swift-evolution