<div dir="ltr">On Tue, May 16, 2017 at 8:01 AM, Gwendal Roué <span dir="ltr">&lt;<a href="mailto:gwendal.roue@gmail.com" target="_blank">gwendal.roue@gmail.com</a>&gt;</span> wrote:<br><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Xiaodi Wu, your opposition has been recorded. You don&#39;t buy the Motivation section. Other people here do, definitely.<br></blockquote><div><br></div><div>I think you make some insightful comments below. But again, to clarify, I am not voicing support or opposition to the ideas themselves.</div><div><br></div><div>I am objecting that this pitch contains mostly ideas discussed previously and amply, and which have been formally considered and rejected. _Whether or not you buy the motivation for doing so_, it is--as a matter of etiquette if nothing else--not appropriate to make repeated pitches every few weeks. As I wrote earlier, few (if any) people would volunteer their time and effort to bring up thoughtful points about an upcoming decision if the same discussion is simply going to repeat itself two weeks after the decision has been made.</div><div><br></div><div>Therefore, I am claiming that even if some believe that this is the best idea ever conceived, and even if minor changes to the rationale or design are made, it should as a matter of principle not be the subject of further discussion on this list _because it has already been rejected_. To do so would undermine accepted norms which are important to encourage thoughtful and timely participation.</div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">
&gt; Divorce the &quot;&quot;&quot; delimiter from the multi-line syntax and have them only support unescaped double-quotes<br>
<br>
</span>This means support for:<br>
<br>
        let x = &quot;<br>
                foo<br>
                bar<br>
                &quot;<br>
<br>
This one is unexpected, and not requested by many users. Does it bring much?<br>
<br>
I wonder whether this addition was introduced in order to make the proposal as consistent as possible, and prevent some criticisms. It has proven pointless. I suggest forgetting about pleasing people who don&#39;t want to be pleased, and to reconsider this &quot;divorce&quot; section. Consistency is not the main point. The main point is UX. This means easing the daily life of code writers, and easing the daily life of code readers (this involves being careful which text editors and code prettyfiers are unable to handle the proposal).<br>
<span class=""><br>
&gt; Support escaping newlines in multi-line strings with a trailing \<br>
<br>
</span>Great. That&#39;s the main request, unless I&#39;m misled: split long literals accross multiple lines.<br>
<br>
Now that Xiaodi Wu has found them, the core team questions about the trailing backslash should be addressed in more details.<br>
<span class=""><br>
&gt; Adopt the C/Objective-C syntax that concatenates single-line strings<br>
<br>
</span>A battle-tested solution. Doesn&#39;t it look redundant with both the &quot;divorce&quot; and the trailing backslash?<br>
<br>
Last, the proposal contains literals without leading and trailing newlines. I thought those were not supported by SE-0168. If this is the case, we need more detail here, so that the proposal is rock solid, and the core team confident it deserves consideration. A little more work, please :-)<br>
<br>
Thanks,<br>
Gwendal Roué<br>
<div class="HOEnZb"><div class="h5"><br>
<br>
<br>
&gt; Le 15 mai 2017 à 23:52, Xiaodi Wu via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; a écrit :<br>
&gt;<br>
&gt; I&#39;m quite sure it means this: As with all parts of Swift, a decision can be re-considered if implementation difficulties are found, or if new insights arise from extended use. Because these features are additive, rejecting them now does not mean that source compatibility requirements would make such re-consideration impossible--if they are to be re-considered in the future. Until such time as a fit justification is found to bring the current decision into question, the decision of the core team is that these proposed features are rejected from inclusion in Swift.<br>
&gt; On Mon, May 15, 2017 at 16:28 David Hart &lt;<a href="mailto:david@hartbit.com">david@hartbit.com</a>&gt; wrote:<br>
&gt;&gt; On 14 May 2017, at 03:55, Xiaodi Wu &lt;<a href="mailto:xiaodi.wu@gmail.com">xiaodi.wu@gmail.com</a>&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt; On Sat, May 13, 2017 at 1:42 AM, David Hart &lt;<a href="mailto:david@hartbit.com">david@hartbit.com</a>&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt;&gt; On 12 May 2017, at 23:14, Xiaodi Wu &lt;<a href="mailto:xiaodi.wu@gmail.com">xiaodi.wu@gmail.com</a>&gt; wrote:<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; I feel like a broken record: Of the three proposed components of the proposed solution, two were amply considered by the community and the core team in SE-0168. The decision has already been made _not_ to implement these ideas at this time.<br>
&gt;&gt;<br>
&gt;&gt; Can you provide me with quote from the Core Team that it should not be implemented at this time? I have troubles finding it.<br>
&gt;&gt;<br>
&gt;&gt;&gt; Significant defects discovered after the fact during implementation or new insights after extensive usage can prompt revisiting the decision, but that is not the case here: implementation did not require further clarification and the feature has only just landed on master. We simply cannot revisit topics willy-nilly. The process simply cannot work that way: few have the time and energy to offer their fullest consideration the first time round, and no one would be willing to do that if it means that the same topic will be revisited one month later.<br>
&gt;&gt;<br>
&gt;&gt; The concerns summarised in this proposal were only heavily discussed after the acceptance of multi-line strings. Therefore, there is a great chance that they were not discussed by the Core Team. We feel obliged to put this proposal forward to formalise those issues.<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; [1]<br>
&gt;&gt;<br>
&gt;&gt; Your draft proposes to &#39;[d]ivorce the `&quot;&quot;&quot;` delimiter from [...] multi-line syntax&#39; in order to allow `&quot;&quot;&quot;long strings&quot;&quot;&quot;` to be valid syntax.<br>
&gt;&gt;<br>
&gt;&gt; SE-0168 proposed &#39;a single simple syntax for inclusion: &quot;&quot;&quot;long strings&quot;&quot;&quot;`, explicitly permitting that syntax.<br>
&gt;&gt;<br>
&gt;&gt; The core team, after considering SE-0168, deliberately rejected that feature for Swift 4. They wrote that they &#39;acknowledge[] that single-line triple quoted strings have other uses in other languages, [...] but supporting that alongside the indentation-stripping behavior leads to a lot of subtlety, and there could be other solutions to the escaping problem down the line, such as raw strings.&#39; They concluded that: &#39;If nothing else, single-line triple quoted strings can be considered later as an additive feature.&#39;<br>
&gt;&gt;<br>
&gt;&gt; [2]<br>
&gt;&gt;<br>
&gt;&gt; Your draft proposes to &#39;support escaping newlines in multi-line strings with a trailing `\`&#39;.<br>
&gt;&gt;<br>
&gt;&gt; The core team, after considering SE-0168, acknowledged that &#39;[d]iscussion on the list raised the idea of allowing a line to end with \ to &quot;escape&quot; the newline and elide it from the value of the literal.&#39; They deliberately rejected that feature for Swift 4, reasoning that &#39;[they] had concerns about only allowing that inside multi-line literals and felt that that could also be considered later as an additive feature.&#39;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; If someone from the Core Team lets us know this is definitely out of scope for Swift 4, we’ll be happy to bring it back once discussion for Swift 5 starts.<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; Not being on the core team, I can&#39;t tell you what&#39;s definitely out of scope, but I&#39;m pretty sure discussing something &quot;down the line&quot; and &quot;later&quot; don&#39;t mean revisiting a topic 22 days after the original proposal is modified and 16 days after it&#39;s implemented, but rather in a future version of Swift, after users have been able to try and gain experience with the approved design.<br>
&gt;<br>
&gt; Thanks for the references! Indeed, those specific points were discussed but I’m not sure what they mean by &quot;can be considered later as an additive feature”. I’m not so certain it necessarily pushes it back to a future version of Swift. Nonetheless, the other points in the proposal don’t seem to have been discussed.<br>
&gt;<br>
&gt;&gt;&gt; On Fri, May 12, 2017 at 15:51 David Hart via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br>
&gt;&gt;&gt; Hi swift-evolution,<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Adrian Zubarev and I have discussed several issues with string literals still unresolved after the multi-line string literals proposals and we believe that they are important enough to address for Swift 4. Here is the pitch for our proposal.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Please let us know what you think:<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; <a href="https://github.com/hartbit/swift-evolution/blob/literal-string-improvements/proposals/XXXX-improve-string-literals.md" rel="noreferrer" target="_blank">https://github.com/hartbit/<wbr>swift-evolution/blob/literal-<wbr>string-improvements/proposals/<wbr>XXXX-improve-string-literals.<wbr>md</a><br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Improve String Literals<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;     • Proposal: SE-XXXX<br>
&gt;&gt;&gt;     • Authors: David Hart, Adrian Zubarev<br>
&gt;&gt;&gt;     • Review Manager: TBD<br>
&gt;&gt;&gt;     • Status: TBD<br>
&gt;&gt;&gt; Introduction<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; This proposal builds on top the new features of SE-0168 Multi-Line String Literals by widening the use-cases for unescaped double-quotes and resolving certain issues around long lines in single and multi-line string literals.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Motivation<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; In Swift 3, String literals have three pain points:<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;     • Strings containing double-quotes<br>
&gt;&gt;&gt;     • Multi-line strings<br>
&gt;&gt;&gt;     • Long single-line strings<br>
&gt;&gt;&gt; Proposal SE-0168 fixed the two first problems with the same syntax. Unfortunately, while an improvement on Swift 3, several problems remain:<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;     • Long single-line strings still require the less than ideal concatenation syntax:<br>
&gt;&gt;&gt; Some project styles (like the Standard Library) mandate a maximum line length, requiring long single-line strings to be hard-wrapped. This still requires odd solutions:<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; assert(condition, &quot;This is a long assertion message that requires &quot; +<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; &quot;string concatenation when the project style enforces maximum line &quot; +<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; &quot;lengths&quot;)<br>
&gt;&gt;&gt;     • Long lines in a multi-line strings can&#39;t be manually wrapped:<br>
&gt;&gt;&gt; let markdown = &quot;&quot;&quot;<br>
&gt;&gt;&gt;     # Title<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;     Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer elementum commodo sem, a congue orci porta sit amet. Duis facilisis, est et vehicula congue, turpis dui ultricies nunc, ut elementum quam elit nec felis. Integer aliquam id risus nec laoreet. Vivamus vitae odio sit amet quam iaculis fermentum nec sed neque.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;     ## Subtitle<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;     Cras et nibh velit. Praesent eleifend sagittis quam, pellentesque lobortis lectus commodo vel. Vivamus suscipit, nulla quis blandit ullamcorper, velit neque euismod nibh, nec blandit mi diam molestie ex. Cras porttitor, est sed pharetra interdum, ipsum mauris viverra quam, sit amet eleifend purus elit sit amet odio.<br>
&gt;&gt;&gt;     &quot;&quot;&quot;<br>
&gt;&gt;&gt;     • Short strings containing double-quotes have to use the multi-line syntax to benefit from unescaped double-quotes:<br>
&gt;&gt;&gt; print(&quot;&quot;&quot;<br>
&gt;&gt;&gt;     { &quot;success&quot;: false, &quot;error&quot;: &quot;Wrong parameter&quot; }<br>
&gt;&gt;&gt;     &quot;&quot;&quot;)<br>
&gt;&gt;&gt; Proposed solution<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; By implementing multi-line string literals and support for unescaped double-quotes with the same syntax, SE-0168 has made those features unusable on their own. By dissociating them and supporting two extra syntax features, we can solve all the above problems:<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Divorce the &quot;&quot;&quot; delimiter from the multi-line syntax and have them only support unescaped double-quotes<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; The change allows us to express short strings containing double-quotes without resorting to the multi-line syntax:<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; print(&quot;&quot;&quot;{ &quot;success&quot;: false, &quot;error&quot;: &quot;Wrong parameter&quot; }&quot;&quot;&quot;)<br>
&gt;&gt;&gt; As a consequence, multi-line strings are now only defined by a newline following the leading delimiter and the whitespace preceeding the trailing delimiter. They gain support for &quot; delimiters, which has the nice advantage of saving a few characters in multi-line strings which are known to never contain double-quotes:<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; print(&quot;&quot;&quot;<br>
&gt;&gt;&gt;     Triple &quot;<br>
&gt;&gt;&gt;  are still valid delimiters<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; &quot;&quot;&quot;)<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; query(&quot;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;     SELECT &#39;name&#39;<br>
&gt;&gt;&gt;     FROM &#39;people&#39;<br>
&gt;&gt;&gt;     WHERE age<br>
&gt;&gt;&gt; &gt; 20<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; &quot;)<br>
&gt;&gt;&gt; Support escaping newlines in multi-line strings with a trailing \<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; This change allows hard-wrapping long lines in multi-line strings. They also have the added benefit of making trailing white-space at the end of source-code lines explicit.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; let markdown = &quot;&quot;&quot;<br>
&gt;&gt;&gt;     # Title<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;     Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer \<br>
&gt;&gt;&gt;     elementum commodo sem, a congue orci porta sit amet. Duis facilisis, est \<br>
&gt;&gt;&gt;     et vehicula congue, turpis dui ultricies nunc, ut elementum quam elit nec \<br>
&gt;&gt;&gt;     felis. Integer aliquam id risus nec laoreet. Vivamus vitae odio sit amet \<br>
&gt;&gt;&gt;     quam iaculis fermentum nec sed neque.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;     ## Subtitle<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;     Cras et nibh velit. Praesent eleifend sagittis quam, pellentesque \<br>
&gt;&gt;&gt;     lobortis lectus commodo vel. Vivamus suscipit, nulla quis blandit \<br>
&gt;&gt;&gt;     ullamcorper, velit neque euismod nibh, nec blandit mi diam molestie \<br>
&gt;&gt;&gt;     ex. Cras porttitor, est sed pharetra interdum, ipsum mauris viverra \<br>
&gt;&gt;&gt;     quam, sit amet eleifend purus elit sit amet odio.<br>
&gt;&gt;&gt;     &quot;&quot;&quot;<br>
&gt;&gt;&gt; Adopt the C/Objective-C syntax that concatenates single-line strings<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; This change will be familiar to C developers and provides a cleaner and more performant solution for long single-line strings:<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; assert(condition, &quot;This is a long assertion message that flows &quot;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; &quot;from one line to the next without requiring the concatenation &quot;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; &quot;operator&quot;<br>
&gt;&gt;&gt; )<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; assert(condition, &quot;&quot;&quot;This is another &quot;single-line&quot; message that &quot;&quot;&quot;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; &quot;&quot;&quot;supports up to two double-quotes (&quot; and &quot;&quot;) without any &quot;&quot;&quot;<br>
&gt;&gt;&gt;     &quot;&quot;&quot;escaping&quot;&quot;&quot;)<br>
&gt;&gt;&gt; Source compatibility<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; This feature is purely additive; it has no effect on source compatibility.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Effect on ABI stability<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; This feature is purely additive; it has no effect on ABI stability.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Effect on API resilience<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; This feature is purely additive; it has no effect on API resilience.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Alternatives considered<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; A different syntax for supporting long single-line strings was discussed where ending delimiters were replaced with the \escaping character, mirroring their use in multi-line strings:<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; assert(condition, &quot;This is a long assertion message that flows \<br>
&gt;&gt;&gt;     &quot;<br>
&gt;&gt;&gt; from one line to the next without requiring the concatenation \<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; &quot;operator&quot;<br>
&gt;&gt;&gt; )<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; assert(condition, &quot;&quot;&quot;This is another &quot;single-line&quot; message that \<br>
&gt;&gt;&gt;     &quot;&quot;&quot;supports up to two double-quotes (&quot; and &quot;&quot;) without any \<br>
&gt;&gt;&gt;     &quot;&quot;&quot;escaping&quot;&quot;&quot;)<br>
&gt;&gt;&gt; That syntax saved two characters per line in strings with &quot;&quot;&quot; delimiters but had several disadvantages:<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;     • It loses the familiarity with C syntax<br>
&gt;&gt;&gt;     • It introduces an asymmetry between the last line and those above<br>
&gt;&gt;&gt;     • It does not do any actual escaping, introducing developer ambiguity with their use in multi-line literals<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; ______________________________<wbr>_________________<br>
&gt;&gt;&gt; swift-evolution mailing list<br>
&gt;&gt;&gt; <a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br>
&gt;&gt;&gt; <a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/<wbr>mailman/listinfo/swift-<wbr>evolution</a><br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt; ______________________________<wbr>_________________<br>
&gt; swift-evolution mailing list<br>
&gt; <a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br>
&gt; <a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/<wbr>mailman/listinfo/swift-<wbr>evolution</a><br>
<br>
</div></div></blockquote></div><br></div></div>