<div dir="ltr">On Wed, Jun 14, 2017 at 11:13 AM, 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"><div class="HOEnZb"><div class="h5"><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>
&gt; If we leave aside for a moment the nomenclature issue where everything in<br>
&gt; Foundation referring to a character is really referring to a Unicode<br>
&gt; scalar, Kevin’s example illustrates the whole problem in a nutshell,<br>
&gt; doesn’t it? In that example, we have a straightforward attempt to slice<br>
&gt; with a misaligned index. The totality of options here are:<br>
&gt;<br>
&gt; * return nil, an option the rejection of which is the premise of your<br>
&gt; proposal<br>
&gt; * return a partial character (i.e., \u{301}), an option which we haven’t<br>
&gt; yet talked about in this thread–seems like this could have simpler<br>
&gt; semantics, potentially yields garbage if the index is garbage but in the<br>
&gt; case of Kevin’s example actually behaves as the user might expect<br>
&gt; * return a whole character after “rounding down”–difficult semantics to<br>
&gt; define and explain, always results in a whole character but in the case of<br>
&gt; Kevin’s example gives an unexpected answer<br>
&gt; * returns a whole character after “rounding up”–difficult semantics to<br>
&gt; define and explain, always results in a whole character but when the index<br>
&gt; is misaligned would result in a character or range of characters in which<br>
&gt; the index is not found<br>
&gt; * trap–simple semantics, never returns garbage, obvious disadvantage that<br>
&gt; execution will not proceed<br>
&gt;<br>
&gt; No clearly perfect answer here. However, _if_ we hew strictly to the stated<br>
&gt; premise of your proposal that failable APIs are awkward enough to justify a<br>
&gt; change, and moreover that the awkwardness is truly “needless” because of<br>
&gt; the rarity of misaligned index usage, then at face value trapping should be<br>
&gt; a perfectly acceptable solution.<br>
&gt;<br>
&gt; That Kevin’s example raises the specter of trapping being a realistic<br>
&gt; occurrence in currently working code actually suggests a challenge to your<br>
&gt; stated premise. If we accept that this challenge is a substantial one, then<br>
&gt; it’s not clear to me that abandoning failable APIs should be ruled out from<br>
&gt; the outset.<br>
&gt;<br>
&gt; However, if this desire to remove failable APIs remains strong then I<br>
&gt; wonder if the undiscussed second option above is worth at least some<br>
&gt; consideration.<br>
<br>
</div></div>I think you&#39;re misunderstanding the motivation here.  It&#39;s not so much<br>
that I want to remove failable APIs as that I want to reduce overall API<br>
surface area.  The current index conversion APIs contribute 16<br>
initializers and 16 methods to the overall size of the library.<br></blockquote><div><br></div><div>Ah, and presumably, having only failable APIs once these different index types are collapsed into one would be too cumbersome.</div></div></div></div>