<div dir="ltr">On Wed, Jun 14, 2017 at 12:01 PM, Dave Abrahams <span dir="ltr">&lt;<a href="mailto:dabrahams@apple.com" target="_blank">dabrahams@apple.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"><span class=""><br>
on Wed Jun 14 2017, Xiaodi Wu &lt;<a href="http://xiaodi.wu-AT-gmail.com" rel="noreferrer" target="_blank">xiaodi.wu-AT-gmail.com</a>&gt; wrote:<br>
<br>
</span><span class="">&gt; On Wed, Jun 14, 2017 at 09:26 Xiaodi Wu &lt;<a href="mailto:xiaodi.wu@gmail.com">xiaodi.wu@gmail.com</a>&gt; wrote:<br>
&gt;<br>
&gt;&gt; If we leave aside for a moment the nomenclature issue where everything in<br>
&gt;&gt; Foundation referring to a character is really referring to a Unicode<br>
&gt;&gt; scalar, Kevin’s example illustrates the whole problem in a nutshell,<br>
&gt;&gt; doesn’t it? In that example, we have a straightforward attempt to slice<br>
&gt;&gt; with a misaligned index. The totality of options here are:<br>
&gt;&gt;<br>
&gt;&gt; * return nil, an option the rejection of which is the premise of your<br>
&gt;&gt; proposal<br>
&gt;&gt; * return a partial character (i.e., \u{301}), an option which we haven’t<br>
&gt;&gt; yet talked about in this thread–seems like this could have simpler<br>
&gt;&gt; semantics, potentially yields garbage if the index is garbage but in the<br>
&gt;&gt; case of Kevin’s example actually behaves as the user might expect<br>
<br>
</span>I think that&#39;s exactly what I was proposing in<br>
<a href="https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20170612/037466.html" rel="noreferrer" target="_blank">https://lists.swift.org/<wbr>pipermail/swift-evolution/<wbr>Week-of-Mon-20170612/037466.<wbr>html</a><br>
<div><div class="h5"><br>
&gt;&gt; * return a whole character after “rounding down”–difficult semantics<br>
&gt;&gt; to define and explain, always results in a whole character but in the<br>
&gt;&gt; case of Kevin’s example gives an unexpected answer * returns a whole<br>
&gt;&gt; character after “rounding up”–difficult semantics to define and<br>
&gt;&gt; explain, always results in a whole character but when the index is<br>
&gt;&gt; misaligned would result in a character or range of characters in<br>
&gt;&gt; which the index is not found * trap–simple semantics, never returns<br>
&gt;&gt; garbage, obvious disadvantage that execution will not proceed<br>
&gt;&gt;<br>
&gt;&gt; No clearly perfect answer here. However, _if_ we hew strictly to the<br>
&gt;&gt; stated premise of your proposal that failable APIs are awkward enough to<br>
&gt;&gt; justify a change, and moreover that the awkwardness is truly “needless”<br>
&gt;&gt; because of the rarity of misaligned index usage, then at face value<br>
&gt;&gt; trapping should be a perfectly acceptable solution.<br>
&gt;&gt;<br>
&gt;&gt; That Kevin’s example raises the specter of trapping being a realistic<br>
&gt;&gt; occurrence in currently working code actually suggests a challenge to your<br>
&gt;&gt; stated premise. If we accept that this challenge is a substantial one, then<br>
&gt;&gt; it’s not clear to me that abandoning failable APIs should be ruled out from<br>
&gt;&gt; the outset.<br>
&gt;&gt;<br>
&gt;&gt; However, if this desire to remove failable APIs remains strong then I<br>
&gt;&gt; wonder if the undiscussed second option above is worth at least some<br>
&gt;&gt; consideration.<br>
&gt;&gt;<br>
&gt;<br>
&gt; Having digested your revised proposed behavior a little better I see you’re<br>
&gt; kind of getting at this exact issue, but I’m uncomfortable with how it’s so<br>
&gt; tied to the underlying encoding, which is not guaranteed to be UTF-16 but<br>
&gt; is assumed to be for the purposes of slicing.<br>
<br>
</div></div>I think there&#39;s some confusion here; probably I have failed to explain<br>
myself.  Today a String happens to always be UTF-16, but there&#39;s no<br>
intention to assume that it is UTF-16 for the purposes of slicing in the<br>
future.  Any place you see something like s.utf16 in an example I&#39;ve<br>
used to illustrate semantics should be interpreted as a s.codeUnits,<br>
where codeUnits is a collection of code units for whatever the<br>
underlying encoding is.<br>
<br>
Tying this to underlying encoding actually reflects the true nature of<br>
String, which is exposed by the semantics of concatenation and range<br>
replacement, where multiple elements may merge into one element).  As<br>
stated in<br>
<a href="https://github.com/apple/swift/blob/master/docs/StringManifesto.md#string-should-be-a-collection-of-characters-again" rel="noreferrer" target="_blank">https://github.com/apple/<wbr>swift/blob/master/docs/<wbr>StringManifesto.md#string-<wbr>should-be-a-collection-of-<wbr>characters-again</a><br>
the elements of a String (or any of its views other than native code<br>
units) is an emergent property.  To anyone operating at Unicode scalar<br>
granularity (which can result in misalignment with respect to<br>
characters) or at the higher granularity of code units (native or<br>
transcoded, which can result in misalignment with all other views), I<br>
think this is actually unsurprising.<br></blockquote><div><br></div><div>That&#39;s fair. It this is critical to the semantics, though, and you expect that some people will operate at that granularity, it seems incongruous that s.codeUnits isn&#39;t actually exposed to the user even if it&#39;d be as a type-erased AnyCollection.</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; I’d like to propose an alternative that attempts to deliver on what<br>
&gt; I’ve called the second option above–somewhat similar:<br>
&gt;<br>
&gt; A string index will notionally or actually keep track of the view in which<br>
&gt; it was originally aligned, be it utf8, utf16, unicodeScalars, or<br>
&gt; characters. A slicing operation str.xxx[idx] will behave as expected if idx<br>
&gt; is not misaligned with respect to str.xxx. If it is misaligned, the<br>
&gt; operation would instead be notionally String(str.yyy[idx...]).xxx.<wbr>first!,<br>
&gt; where yyy is the original view in which idx was known aligned–if idx is not<br>
&gt; also misaligned with respect to str.yyy (as might be the case if idx was<br>
&gt; returned from an operation on a different string). If it is still<br>
&gt; misaligned, trap.<br>
<br>
</span>That seems much more complicsted than what I&#39;m proposing, but maybe<br>
that&#39;s because I haven&#39;t yet explained myself clearly enough.<br></blockquote><div> </div><div>I think I catch your drift, and I&#39;m converging on your way of thinking here.</div></div></div></div>