<div dir="ltr">On Thu, Apr 13, 2017 at 4:03 AM, Brent Royal-Gordon <span dir="ltr">&lt;<a href="mailto:brent@architechies.com" target="_blank">brent@architechies.com</a>&gt;</span> wrote:<br><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><div style="word-wrap:break-word"><div><span class="gmail-"><blockquote type="cite"><div>On Apr 12, 2017, at 5:39 PM, Xiaodi Wu &lt;<a href="mailto:xiaodi.wu@gmail.com" target="_blank">xiaodi.wu@gmail.com</a>&gt; wrote:</div><br class="gmail-m_-5253474253423077924Apple-interchange-newline"><div><div dir="ltr">On Wed, Apr 12, 2017 at 5:20 PM, Brent Royal-Gordon <span dir="ltr">&lt;<a href="mailto:brent@architechies.com" target="_blank">brent@architechies.com</a>&gt;</span> wrote:<br><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><div style="word-wrap:break-word"><div>Wow, maybe I shouldn&#39;t have slept.</div><div><br></div><div>Okay, let&#39;s deal with trailing newline first. I&#39;m *very* confident that trailing newlines should be kept by default. This opinion comes from lots of practical experience with multiline string features in other languages. In practice, if you&#39;re generating files in a line-oriented way, you&#39;re usually generating them a line at a time. It&#39;s pretty rare that you want to generate half a line and then add more to it in another statement; it&#39;s more likely you&#39;ll interpolate the data. I&#39;m not saying it doesn&#39;t happen, of course, but it happens a lot less often than you would think just sitting by the fire, drinking whiskey and musing over strings.</div><div><br></div><div>I know that, if you&#39;re pushing for this feature, it&#39;s not satisfying to have the answer be &quot;trust me, it&#39;s not what you want&quot;. But trust me, it&#39;s not what you want.</div></div></blockquote><div><br></div><div>This is not a very good argument. If you are generating files in a line-oriented way, it is the function _emitting_ the string that handles the line-orientedness, not the string itself. That is the example set by `print()`:</div><div><br></div><div>```</div><div>print(&quot;Hello, world!&quot;) // Emits &quot;Hello, world!\n&quot;</div><div>```</div><div></div></div></div></div></div></blockquote><div><br></div></span><div>You say &quot;this is the example set by `print`&quot;, but I don&#39;t think anything else actually *follows* that example. No other I/O operation in Swift behaves this way.</div></div></div></blockquote><div><br></div><div>To be more accurate, it&#39;s not `print` that specifies this behavior, but rather the standard output stream&#39;s implementation of `TextOutputStream.write(_:)`. Swift *explicitly* leaves this choice up to the TextOutputStream-conforming type. That is, the behavior is up to the receiver and not the argument of a call to `TextOutputStream.write(_:)`.</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><div style="word-wrap:break-word"><div><div>The underlying `TextOutputStream.write(_:)` doesn&#39;t; the I/O in Foundation doesn&#39;t; file descriptor I/O doesn&#39;t.</div></div></div></blockquote><div><br></div><div><div>And this goes to my point: there is line-oriented I/O, and there is non-line-oriented I/O. After all, why would I/O operations designed to write arbitrary bytes emit trailing newlines by default? It is the I/O operation that determines whether trailing newlines are implied or not, *not* the string.</div></div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><div style="word-wrap:break-word"><div><div>Concatenation certainly doesn&#39;t; nor does anything else you might do to assemble several multiline string literals into a whole.</div></div></div></blockquote><div><br></div><div>And this goes to my other point: it *shouldn&#39;t*, because there is nothing about concatenation that is specifically &quot;line-oriented.&quot; I am not aware of any language that concatenates with `+` which infers a default separator. Anyone who has ever used `+` has *always* appended their own separator. That is the user expectation, not what you show below.</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><div style="word-wrap:break-word"><div><div>So I think `print()` is the exception here, not the rule.</div><div><br></div><div>In my opinion, modulo the &quot;newline after leading delimiter&quot; question, if code like this example:</div><div><br></div><div><div><span class="gmail-m_-5253474253423077924Apple-tab-span" style="white-space:pre-wrap">        </span>var xml = &quot;&quot;&quot;</div><span class="gmail-"><div><span class="gmail-m_-5253474253423077924Apple-tab-span" style="white-space:pre-wrap">        </span>    &lt;?xml version=&quot;1.0&quot;?&gt;</div><div><span class="gmail-m_-5253474253423077924Apple-tab-span" style="white-space:pre-wrap">        </span>    &lt;catalog&gt;</div><div><span class="gmail-m_-5253474253423077924Apple-tab-span" style="white-space:pre-wrap">        </span>    &quot;&quot;&quot;</div><div><span class="gmail-m_-5253474253423077924Apple-tab-span" style="white-space:pre-wrap">        </span></div></span><div><span class="gmail-m_-5253474253423077924Apple-tab-span" style="white-space:pre-wrap">        </span>for (id, author, title, genre, price) in bookTuples {</div><span class="gmail-"><div><span class="gmail-m_-5253474253423077924Apple-tab-span" style="white-space:pre-wrap">        </span>    xml += &quot;&quot;&quot;</div><div><span class="gmail-m_-5253474253423077924Apple-tab-span" style="white-space:pre-wrap">        </span>            &lt;book id=&quot;bk\(id)&quot;&gt;</div><div><span class="gmail-m_-5253474253423077924Apple-tab-span" style="white-space:pre-wrap">        </span>                &lt;author&gt;\(author)&lt;/author&gt;</div><div><span class="gmail-m_-5253474253423077924Apple-tab-span" style="white-space:pre-wrap">        </span>                &lt;title&gt;\(title)&lt;/title&gt;</div><div><span class="gmail-m_-5253474253423077924Apple-tab-span" style="white-space:pre-wrap">        </span>                &lt;genre&gt;\(genre)&lt;/genre&gt;</div><div><span class="gmail-m_-5253474253423077924Apple-tab-span" style="white-space:pre-wrap">        </span>                &lt;price&gt;\(price)&lt;/price&gt;</div><div><span class="gmail-m_-5253474253423077924Apple-tab-span" style="white-space:pre-wrap">        </span>            &lt;/book&gt;</div><div><span class="gmail-m_-5253474253423077924Apple-tab-span" style="white-space:pre-wrap">        </span>        &quot;&quot;&quot;</div><div><span class="gmail-m_-5253474253423077924Apple-tab-span" style="white-space:pre-wrap">        </span>}</div><div><span class="gmail-m_-5253474253423077924Apple-tab-span" style="white-space:pre-wrap">        </span></div></span><div><span class="gmail-m_-5253474253423077924Apple-tab-span" style="white-space:pre-wrap">        </span>xml += &quot;&quot;&quot;</div><div><span class="gmail-m_-5253474253423077924Apple-tab-span" style="white-space:pre-wrap">        </span>    &lt;/catalog&gt;</div><div><span class="gmail-m_-5253474253423077924Apple-tab-span" style="white-space:pre-wrap">        </span>    &quot;&quot;&quot;</div><div><br></div><div>Doesn&#39;t assemble the kind of string that it&#39;s blatantly obvious the user is trying to assemble, I think the syntax has failed.</div></div></div></div></blockquote><div><br></div><div>First, let&#39;s be clear that this is an argument against your proposed no-newline-stripping-anywhere rule, so clearly this is not the motivating use case for that proposed design. I see you&#39;ve moved away from it.</div><div><br></div><div>Second, this is a circular argument, where you are asserting that your proposed no-trailing-newline-stripping is the only blatantly obvious meaning because it is blatantly obvious. On the contrary, it is not at all clear to me that the user obviously wants a newline, not any more so than the following, which clearly does not and should not insert newlines:</div><div><br></div><div><div>```</div><div>var xml = &quot;&lt;?xml version=\&quot;1.0\&quot;?&gt;&quot;</div><div>xml += &quot;&lt;catalog&gt;&quot;</div><div><br></div><div>for (id, _, _, _, _) in bookTuples {</div><div>  xml += &quot;&lt;book id=\&quot;bk\(id)\&quot;&gt;Book ID: \(id)&lt;/book&gt;&quot;</div><div>}</div><div><br></div><div>xml += &quot;&lt;/catalog&gt;&quot;</div></div><div>```</div><div><br></div><div>To me, the only blatantly obvious behavior is that if you&#39;re going to want a separator and you&#39;re using `+` or `+=` for string concatenation, you concatenate the separator yourself. Why would that change just because there&#39;s multiline string syntax? The only thing that multiline string syntax should _maybe_ suggest to the reader is that there&#39;s a decent chance that there&#39;s a newline somewhere in the string, *not* that there&#39;s a decent chance that the string ends with one.</div><div><br></div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><div style="word-wrap:break-word"><div><div><div>`print()` is the outlier. It&#39;s an important enough outlier that we should probably help the user notice when they&#39;re about to get it wrong, but an outlier it is.</div></div></div><span class="gmail-HOEnZb"><font color="#888888"><br><div>
<span class="gmail-m_-5253474253423077924Apple-style-span" style="border-collapse:separate;font-variant-ligatures:normal;font-variant-east-asian:normal;line-height:normal"><div><div style="font-size:12px">-- </div><div style="font-size:12px">Brent Royal-Gordon</div><div style="font-size:12px">Architechies</div></div></span>

</div>
<br></font></span></div></blockquote></div><br></div></div>