The restriction to ASCII operators need not be permanent. However, we were unable to converge on a subset of mathematical symbols that we could definitively consider to be operators in contradistinction to those not included in that subset. Future Unicode recommendations on operators are pending, and Swift can expand its operator characters accordingly in the future.<br><br>Moreover, we do not know of any non-ASCII operators in the wild at present. A branch of the Swift standard library tried out set algebra operators, but that has not become the chosen API.<br><br>Finally, ASCII-only operators allow us to postpone design of more sophisticated confusables checking to a later point. Unicode has seven or eight varieties of forward slashes, at least several of which are plausible and distinct operator characters, and figuring out how to deal with this scenario would benefit from work from the Unicode Consortium that is still pending.<br><div class="gmail_quote"><div dir="ltr">On Wed, Oct 19, 2016 at 15:47 Jean-Denis Muys via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word" class="gmail_msg"><div class="gmail_msg">Before and above anything else, if I read the proposal correctly, we will not be able any more to use math operator signs as operators, beyond the paltry half dozen or so in the ASCII character set???</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">I strongly oppose such a restriction. Maths symbols (including <span style="font-family:consolas,&#39;liberation mono&#39;,menlo,courier,monospace;font-size:13.6px;background-color:rgba(0,0,0,0.0392157);color:rgb(51,51,51)" class="gmail_msg">∪</span>) are widely recognised in the scientific community and this change, IIUC, is very hostile to any scientific computing.</div></div><div style="word-wrap:break-word" class="gmail_msg"><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">Jean-Denis</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg"><br class="gmail_msg"></div><br class="gmail_msg"></div><div style="word-wrap:break-word" class="gmail_msg"><div class="gmail_msg"><blockquote type="cite" class="gmail_msg"><div class="gmail_msg">On 19 Oct 2016, at 08:34, Jacob Bandes-Storch via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="gmail_msg" target="_blank">swift-evolution@swift.org</a>&gt; wrote:</div><br class="m_-8343617951962145237Apple-interchange-newline gmail_msg"></blockquote></div></div><div style="word-wrap:break-word" class="gmail_msg"><div class="gmail_msg"><blockquote type="cite" class="gmail_msg"><div class="gmail_msg"><div dir="ltr" class="gmail_msg"><div class="gmail_msg">Dear Swift-Evolution community,</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">A few of us have been preparing a proposal to refine the definitions of identifiers &amp; operators. This includes some changes to the permitted Unicode characters.</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">The latest (perhaps final?) draft is available here:</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">    <a href="https://github.com/jtbandes/swift-evolution/blob/unicode-id-op/proposals/NNNN-refining-identifier-and-operator-symbology.md" class="gmail_msg" target="_blank">https://github.com/jtbandes/swift-evolution/blob/unicode-id-op/proposals/NNNN-refining-identifier-and-operator-symbology.md</a></div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">We&#39;d welcome your initial thoughts, and will probably submit a PR soon to the swift-evolution repo for a formal review. Full text follows below.</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg"><div class="m_-8343617951962145237gmail_signature gmail_msg"><div dir="ltr" class="gmail_msg"><div class="gmail_msg">—Jacob Bandes-Storch, Xiaodi Wu, Erica Sadun, Jonathan Shapiro<br class="gmail_msg"></div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg"><h1 style="box-sizing:border-box;margin:0px 0px 16px;line-height:1.25;padding-bottom:0.3em;border-bottom:1px solid rgb(238,238,238);color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;" class="gmail_msg">Refining Identifier and Operator Symbology</h1><ul style="box-sizing:border-box;padding-left:2em;margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:16px" class="gmail_msg"><li style="box-sizing:border-box" class="gmail_msg">Proposal: <a href="https://github.com/jtbandes/swift-evolution/blob/unicode-id-op/proposals/NNNN-refining-identifier-and-operator-symbology.md" style="box-sizing:border-box;background-color:transparent;color:rgb(64,120,192);text-decoration:none" class="gmail_msg" target="_blank">SE-NNNN</a></li><li style="box-sizing:border-box;margin-top:0.25em" class="gmail_msg">Authors: <a href="https://github.com/jtbandes" style="box-sizing:border-box;background-color:transparent;color:rgb(64,120,192);text-decoration:none" class="gmail_msg" target="_blank">Jacob Bandes-Storch</a>, <a href="https://github.com/erica" style="box-sizing:border-box;background-color:transparent;color:rgb(64,120,192);text-decoration:none" class="gmail_msg" target="_blank">Erica Sadun</a>, <a href="https://github.com/xwu" style="box-sizing:border-box;background-color:transparent;color:rgb(64,120,192);text-decoration:none" class="gmail_msg" target="_blank">Xiaodi Wu</a>, Jonathan Shapiro</li><li style="box-sizing:border-box;margin-top:0.25em" class="gmail_msg">Review Manager: TBD</li><li style="box-sizing:border-box;margin-top:0.25em" class="gmail_msg">Status: <span style="box-sizing:border-box;font-weight:600" class="gmail_msg">Awaiting review</span></li></ul><h2 style="box-sizing:border-box;margin-top:24px;margin-bottom:16px;line-height:1.25;padding-bottom:0.3em;border-bottom:1px solid rgb(238,238,238);color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;" class="gmail_msg"><a id="m_-8343617951962145237gmail-user-content-introduction" class="m_-8343617951962145237gmail-anchor gmail_msg" href="https://github.com/jtbandes/swift-evolution/blob/unicode-id-op/proposals/NNNN-refining-identifier-and-operator-symbology.md#introduction" style="box-sizing:border-box;background-color:transparent;color:rgb(64,120,192);text-decoration:none;float:left;padding-right:4px;line-height:1" target="_blank"></a>Introduction</h2><p style="box-sizing:border-box;margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:16px" class="gmail_msg">This proposal seeks to refine and rationalize Swift&#39;s identifier and operator symbology. Specifically, this proposal:</p><ul style="box-sizing:border-box;padding-left:2em;margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:16px" class="gmail_msg"><li style="box-sizing:border-box" class="gmail_msg">adopts the Unicode recommendation for identifier characters, with some minor exceptions;</li><li style="box-sizing:border-box;margin-top:0.25em" class="gmail_msg">restricts the legal operator set to the current ASCII operator characters;</li><li style="box-sizing:border-box;margin-top:0.25em" class="gmail_msg">changes where dots may appear in operators; and</li><li style="box-sizing:border-box;margin-top:0.25em" class="gmail_msg">disallows Emoji from identifiers and operators.</li></ul><h3 style="box-sizing:border-box;margin-top:24px;margin-bottom:16px;font-size:1.25em;line-height:1.25;color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;" class="gmail_msg"><a id="m_-8343617951962145237gmail-user-content-prior-discussion-threads--proposals" class="m_-8343617951962145237gmail-anchor gmail_msg" href="https://github.com/jtbandes/swift-evolution/blob/unicode-id-op/proposals/NNNN-refining-identifier-and-operator-symbology.md#prior-discussion-threads--proposals" style="box-sizing:border-box;background-color:transparent;color:rgb(64,120,192);text-decoration:none;float:left;padding-right:4px;line-height:1" target="_blank"></a>Prior discussion threads &amp; proposals</h3><ul style="box-sizing:border-box;padding-left:2em;margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:16px" class="gmail_msg"><li style="box-sizing:border-box" class="gmail_msg"><a href="https://github.com/apple/swift-evolution/pull/531" style="box-sizing:border-box;background-color:transparent;color:rgb(64,120,192);text-decoration:none" class="gmail_msg" target="_blank">Proposal: Normalize Unicode identifiers</a></li><li style="box-sizing:border-box;margin-top:0.25em" class="gmail_msg"><a href="https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20160912/027108.html" style="box-sizing:border-box;background-color:transparent;color:rgb(64,120,192);text-decoration:none" class="gmail_msg" target="_blank">Unicode identifiers &amp; operators</a>, with <a href="https://gist.github.com/jtbandes/c0b0c072181dcd22c3147802025d0b59" style="box-sizing:border-box;background-color:transparent;color:rgb(64,120,192);text-decoration:none" class="gmail_msg" target="_blank">pre-proposal</a> (a precursor to this document)</li><li style="box-sizing:border-box;margin-top:0.25em" class="gmail_msg"><a href="https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20160926/027479.html" style="box-sizing:border-box;background-color:transparent;color:rgb(64,120,192);text-decoration:none" class="gmail_msg" target="_blank">Lexical matters: identifiers and operators</a></li><li style="box-sizing:border-box;margin-top:0.25em" class="gmail_msg"><a href="https://github.com/apple/swift-evolution/pull/354" style="box-sizing:border-box;background-color:transparent;color:rgb(64,120,192);text-decoration:none" class="gmail_msg" target="_blank">Proposal: Allow Single Dollar Sign as Valid Identifier</a></li><li style="box-sizing:border-box;margin-top:0.25em" class="gmail_msg"><a href="https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20151228/005133.html" style="box-sizing:border-box;background-color:transparent;color:rgb(64,120,192);text-decoration:none" class="gmail_msg" target="_blank">Free the &#39;$&#39; Symbol!</a></li><li style="box-sizing:border-box;margin-top:0.25em" class="gmail_msg"><a href="https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20151214/003176.html" style="box-sizing:border-box;background-color:transparent;color:rgb(64,120,192);text-decoration:none" class="gmail_msg" target="_blank">Request to add middle dot (U+00B7) as operator character?</a></li></ul><h3 style="box-sizing:border-box;margin-top:24px;margin-bottom:16px;font-size:1.25em;line-height:1.25;color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;" class="gmail_msg"><a id="m_-8343617951962145237gmail-user-content-guiding-principles" class="m_-8343617951962145237gmail-anchor gmail_msg" href="https://github.com/jtbandes/swift-evolution/blob/unicode-id-op/proposals/NNNN-refining-identifier-and-operator-symbology.md#guiding-principles" style="box-sizing:border-box;background-color:transparent;color:rgb(64,120,192);text-decoration:none;float:left;padding-right:4px;line-height:1" target="_blank"></a>Guiding principles</h3><p style="box-sizing:border-box;margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:16px" class="gmail_msg">Chris Lattner has written:</p><blockquote style="box-sizing:border-box;margin:0px 0px 16px;padding:0px 1em;color:rgb(119,119,119);border-left:0.25em solid rgb(221,221,221);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:16px" class="gmail_msg"><div style="box-sizing:border-box;margin-top:0px;margin-bottom:0px" class="gmail_msg">…our current operator space (particularly the unicode segments covered) is not super well considered. It would be great for someone to take a more systematic pass over them to rationalize things.</div></blockquote><blockquote style="box-sizing:border-box;margin:0px 0px 16px;padding:0px 1em;color:rgb(119,119,119);border-left:0.25em solid rgb(221,221,221);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:16px" class="gmail_msg"><div style="box-sizing:border-box;margin-top:0px;margin-bottom:0px" class="gmail_msg">We need a token to be unambiguously an operator or identifier - we can have different rules for the leading and subsequent characters though.</div></blockquote><blockquote style="box-sizing:border-box;margin:0px 0px 16px;padding:0px 1em;color:rgb(119,119,119);border-left:0.25em solid rgb(221,221,221);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:16px" class="gmail_msg"><p style="box-sizing:border-box;margin-top:0px;margin-bottom:16px" class="gmail_msg">…any proposal that breaks:</p><pre style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;margin-top:0px;margin-bottom:16px;font-stretch:normal;line-height:1.45;word-wrap:normal;padding:16px;overflow:auto;background-color:rgb(247,247,247);border-radius:3px" class="gmail_msg"><code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0px;margin:0px;background-image:initial;background-position:initial;background-size:initial;background-repeat:initial;background-origin:initial;background-clip:initial;background-color:transparent;border-radius:3px;word-break:normal;border:0px;display:inline;overflow:visible;line-height:inherit;word-wrap:normal" class="gmail_msg">let 🐶🐮 = &quot;moof&quot;
</code></pre><div style="box-sizing:border-box;margin-top:0px;margin-bottom:0px" class="gmail_msg">will not be tolerated. :-) :-)</div></blockquote><h2 style="box-sizing:border-box;margin-top:24px;margin-bottom:16px;line-height:1.25;padding-bottom:0.3em;border-bottom:1px solid rgb(238,238,238);color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;" class="gmail_msg"><a id="m_-8343617951962145237gmail-user-content-motivation" class="m_-8343617951962145237gmail-anchor gmail_msg" href="https://github.com/jtbandes/swift-evolution/blob/unicode-id-op/proposals/NNNN-refining-identifier-and-operator-symbology.md#motivation" style="box-sizing:border-box;background-color:transparent;color:rgb(64,120,192);text-decoration:none;float:left;padding-right:4px;line-height:1" target="_blank"></a>Motivation</h2><p style="box-sizing:border-box;margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:16px" class="gmail_msg">By supporting custom Unicode operators and identifiers, Swift attempts to accomodate programmers and programming styles from many languages and cultures. It deserves a well-thought-out specification of which characters are valid. However, Swift&#39;s current identifier and operator character sets do not conform to any Unicode standards, nor have they been rationalized in the language or compiler documentation.</p><p style="box-sizing:border-box;margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:16px" class="gmail_msg">Identifiers, which serve as <em style="box-sizing:border-box" class="gmail_msg">names</em> for various entities, are linguistic in nature and <span style="box-sizing:border-box;font-weight:600" class="gmail_msg">must</span> permit a variety of characters to properly serve non–English-speaking coders. This issue has been considered by the communities of many programming languages already, and the Unicode Consortium has published recommendations on how to choose identifier character sets — Swift should make an effort to conform to these recommendations.</p><p style="box-sizing:border-box;margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:16px" class="gmail_msg">Operators, on the other hand, should be rare and carefully chosen, because they suffer from low discoverability and difficult readability. They are by nature <em style="box-sizing:border-box" class="gmail_msg">symbols</em>, not names. This places a cognitive cost on users with respect to both recall (&quot;What is the operator that applies the behavior I need?&quot;) and recognition (&quot;What does the operator in this code do?&quot;). While <em style="box-sizing:border-box" class="gmail_msg">almost every</em> nontrivial program defines many new identifiers, most programs do not define new operators.</p><p style="box-sizing:border-box;margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:16px" class="gmail_msg">As operators become more esoteric or customized, the cognitive cost rises. Recognizing a function name like <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">formUnion(with:)</code> is simpler for many programmers than recalling what the <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">∪</code> operator does. Swift&#39;s current operator character set includes many characters that aren&#39;t traditional and recognizable operators — this encourages problematic and frivolous uses in an otherwise safe language.</p><p style="box-sizing:border-box;margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:16px" class="gmail_msg">Today, there are many discrepancies and edge cases motivating these changes:</p><ul style="box-sizing:border-box;padding-left:2em;margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:16px" class="gmail_msg"><li style="box-sizing:border-box" class="gmail_msg">· is an identifier, while • is an operator.</li><li style="box-sizing:border-box;margin-top:0.25em" class="gmail_msg">The Greek question mark ; is a valid identifier.</li><li style="box-sizing:border-box;margin-top:0.25em" class="gmail_msg">Braille patterns ⠟ seem letter-like, but are operator characters.</li><li style="box-sizing:border-box;margin-top:0.25em" class="gmail_msg"><span style="box-sizing:border-box;font-family:&quot;apple color emoji&quot;,&quot;segoe ui&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:21px;line-height:20px;vertical-align:middle;margin-right:0px" class="gmail_msg">🙂</span><span style="box-sizing:border-box;font-family:&quot;apple color emoji&quot;,&quot;segoe ui&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:21px;line-height:20px;vertical-align:middle;margin-right:0px" class="gmail_msg">🤘</span><span style="box-sizing:border-box;font-family:&quot;apple color emoji&quot;,&quot;segoe ui&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:21px;line-height:20px;vertical-align:middle;margin-right:0px" class="gmail_msg">▶️</span><span style="box-sizing:border-box;font-family:&quot;apple color emoji&quot;,&quot;segoe ui&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:21px;line-height:20px;vertical-align:middle;margin-right:0px" class="gmail_msg">🛩</span>🂡 are identifiers, while <span style="box-sizing:border-box;font-family:&quot;apple color emoji&quot;,&quot;segoe ui&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:21px;line-height:20px;vertical-align:middle;margin-right:0px" class="gmail_msg">☹️</span><span style="box-sizing:border-box;font-family:&quot;apple color emoji&quot;,&quot;segoe ui&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:21px;line-height:20px;vertical-align:middle;margin-right:0px" class="gmail_msg">✌️</span><span style="box-sizing:border-box;font-family:&quot;apple color emoji&quot;,&quot;segoe ui&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:21px;line-height:20px;vertical-align:middle;margin-right:0px" class="gmail_msg">🔼</span><span style="box-sizing:border-box;font-family:&quot;apple color emoji&quot;,&quot;segoe ui&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:21px;line-height:20px;vertical-align:middle;margin-right:0px" class="gmail_msg">✈️</span><span style="box-sizing:border-box;font-family:&quot;apple color emoji&quot;,&quot;segoe ui&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:21px;line-height:20px;vertical-align:middle;margin-right:0px" class="gmail_msg">♠️</span> are operators.</li><li style="box-sizing:border-box;margin-top:0.25em" class="gmail_msg">Some <em style="box-sizing:border-box" class="gmail_msg">non-combining</em> diacritics ´ ¨ ꓻ are valid in identifiers.</li><li style="box-sizing:border-box;margin-top:0.25em" class="gmail_msg">Some completely non-linguistic characters, such as ۞ and ༒, are valid in identifiers.</li><li style="box-sizing:border-box;margin-top:0.25em" class="gmail_msg">Some symbols such as ⚄ and ♄ are operators, despite not really being &quot;operator-like&quot;.</li><li style="box-sizing:border-box;margin-top:0.25em" class="gmail_msg">A small handful of characters 〡〢〣〤〥〦〧〨〩 〪 〫 〬 〭 〮 〯 are valid in <span style="box-sizing:border-box;font-weight:600" class="gmail_msg">both</span> identifiers and operators.</li><li style="box-sizing:border-box;margin-top:0.25em" class="gmail_msg">Some non-printing characters such as 2064 INVISIBLE PLUS and 200B ZERO WIDTH SPACE are valid identifiers.</li><li style="box-sizing:border-box;margin-top:0.25em" class="gmail_msg">Currency symbols are split across operators (¢ £ ¤ ¥) and identifiers ($ ₪ € ₱ ₹ ฿ ...).</li></ul><p style="box-sizing:border-box;margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:16px" class="gmail_msg">This matter should be considered in a near timeframe (Swift 3.1 or 4) as it is both fundamental to Swift and will produce source-breaking changes.</p><h2 style="box-sizing:border-box;margin-top:24px;margin-bottom:16px;line-height:1.25;padding-bottom:0.3em;border-bottom:1px solid rgb(238,238,238);color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;" class="gmail_msg"><a id="m_-8343617951962145237gmail-user-content-precedent-in-other-languages" class="m_-8343617951962145237gmail-anchor gmail_msg" href="https://github.com/jtbandes/swift-evolution/blob/unicode-id-op/proposals/NNNN-refining-identifier-and-operator-symbology.md#precedent-in-other-languages" style="box-sizing:border-box;background-color:transparent;color:rgb(64,120,192);text-decoration:none;float:left;padding-right:4px;line-height:1" target="_blank"></a>Precedent in other languages</h2><p style="box-sizing:border-box;margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:16px" class="gmail_msg"><span style="box-sizing:border-box;font-weight:600" class="gmail_msg">Haskell</span> distinguishes identifiers/operators by their <a href="http://www.fileformat.info/info/unicode/category/index.htm" style="box-sizing:border-box;background-color:transparent;color:rgb(64,120,192);text-decoration:none" class="gmail_msg" target="_blank">general category</a> such as &quot;any Unicode lowercase letter&quot;, &quot;any Unicode symbol or punctuation&quot;, and so forth. Identifiers can start with any lowercase letter or <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">_</code>, and may contain any letter/digit/<code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">&#39;</code>/<code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">_</code>. This includes letters like δ and Я, and digits like ٢.</p><ul style="box-sizing:border-box;padding-left:2em;margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:16px" class="gmail_msg"><li style="box-sizing:border-box" class="gmail_msg"><a href="https://www.haskell.org/onlinereport/syntax-iso.html" style="box-sizing:border-box;background-color:transparent;color:rgb(64,120,192);text-decoration:none" class="gmail_msg" target="_blank">Haskell Syntax Reference</a></li><li style="box-sizing:border-box;margin-top:0.25em" class="gmail_msg"><a href="https://github.com/ghc/ghc/blob/714bebff44076061d0a719c4eda2cfd213b7ac3d/compiler/parser/Lexer.x#L1949-L1973" style="box-sizing:border-box;background-color:transparent;color:rgb(64,120,192);text-decoration:none" class="gmail_msg" target="_blank">Haskell Lexer</a></li></ul><p style="box-sizing:border-box;margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:16px" class="gmail_msg"><span style="box-sizing:border-box;font-weight:600" class="gmail_msg">Scala</span> similarly allows letters, numbers, <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">$</code>, and <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">_</code> in identifiers, distinguishing by general categories <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">Ll</code>, <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">Lu</code>, <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">Lt</code>, <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">Lo</code>, and <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">Nl</code>. Operator characters include mathematical and other symbols (<code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">Sm</code> and <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">So</code>) in addition to other ASCII symbol characters.</p><ul style="box-sizing:border-box;padding-left:2em;margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:16px" class="gmail_msg"><li style="box-sizing:border-box" class="gmail_msg"><a href="http://www.scala-lang.org/files/archive/spec/2.11/01-lexical-syntax.html#lexical-syntax" style="box-sizing:border-box;background-color:transparent;color:rgb(64,120,192);text-decoration:none" class="gmail_msg" target="_blank">Scala Lexical Syntax</a></li></ul><p style="box-sizing:border-box;margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:16px" class="gmail_msg"><span style="box-sizing:border-box;font-weight:600" class="gmail_msg">ECMAScript 2015 (&quot;ES6&quot;)</span> uses <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">ID_Start</code> and <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">ID_Continue</code>, as well as <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">Other_ID_Start</code> / <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">Other_ID_Continue</code>, for identifiers.</p><ul style="box-sizing:border-box;padding-left:2em;margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:16px" class="gmail_msg"><li style="box-sizing:border-box" class="gmail_msg"><a href="http://www.ecma-international.org/ecma-262/6.0/#sec-names-and-keywords" style="box-sizing:border-box;background-color:transparent;color:rgb(64,120,192);text-decoration:none" class="gmail_msg" target="_blank">ECMAScript Specification: Names and Keywords</a></li></ul><p style="box-sizing:border-box;margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:16px" class="gmail_msg"><span style="box-sizing:border-box;font-weight:600" class="gmail_msg">Python 3</span> uses <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">XID_Start</code> and <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">XID_Continue</code>.</p><ul style="box-sizing:border-box;padding-left:2em;margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:16px" class="gmail_msg"><li style="box-sizing:border-box" class="gmail_msg"><a href="https://docs.python.org/3/reference/lexical_analysis.html#grammar-token-identifier" style="box-sizing:border-box;background-color:transparent;color:rgb(64,120,192);text-decoration:none" class="gmail_msg" target="_blank">The Python Language Reference: Identifiers and Keywords</a></li><li style="box-sizing:border-box;margin-top:0.25em" class="gmail_msg"><a href="https://www.python.org/dev/peps/pep-3131/" style="box-sizing:border-box;background-color:transparent;color:rgb(64,120,192);text-decoration:none" class="gmail_msg" target="_blank">PEP 3131: Supporting Non-ASCII Identifiers</a></li></ul><h2 style="box-sizing:border-box;margin-top:24px;margin-bottom:16px;line-height:1.25;padding-bottom:0.3em;border-bottom:1px solid rgb(238,238,238);color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;" class="gmail_msg"><a id="m_-8343617951962145237gmail-user-content-proposed-solution" class="m_-8343617951962145237gmail-anchor gmail_msg" href="https://github.com/jtbandes/swift-evolution/blob/unicode-id-op/proposals/NNNN-refining-identifier-and-operator-symbology.md#proposed-solution" style="box-sizing:border-box;background-color:transparent;color:rgb(64,120,192);text-decoration:none;float:left;padding-right:4px;line-height:1" target="_blank"></a>Proposed solution</h2><p style="box-sizing:border-box;margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:16px" class="gmail_msg">For identifiers, adopt the recommendations made in <a href="http://unicode.org/reports/tr31/" style="box-sizing:border-box;background-color:transparent;color:rgb(64,120,192);text-decoration:none" class="gmail_msg" target="_blank">UAX #31 Identifier and Pattern Syntax</a>, deriving the sets of valid characters from <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">ID_Start</code> and <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">ID_Continue</code>. Normalize identifiers using Normalization Form C (NFC).</p><p style="box-sizing:border-box;margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:16px" class="gmail_msg">(For operators, no such recommendation currently exists, although active work is in progress to update UAX #31 to address &quot;operator identifiers&quot;.)</p><p style="box-sizing:border-box;margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:16px" class="gmail_msg">Restrict operators to those ASCII characters which are currently operators. All other operator characters are removed from the language.</p><p style="box-sizing:border-box;margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:16px" class="gmail_msg">Allow dots in operators in any location, but only in runs of two or more.</p><p style="box-sizing:border-box;margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:16px" class="gmail_msg">(Overall, this proposal is aggressive in its removal of problematic characters. We are not attempting to prevent the addition or re-addition of characters in the future, but by paring the set down now, we require any future changes to pass the high bar of the Swift Evolution process.)</p><h2 style="box-sizing:border-box;margin-top:24px;margin-bottom:16px;line-height:1.25;padding-bottom:0.3em;border-bottom:1px solid rgb(238,238,238);color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;" class="gmail_msg"><a id="m_-8343617951962145237gmail-user-content-detailed-design" class="m_-8343617951962145237gmail-anchor gmail_msg" href="https://github.com/jtbandes/swift-evolution/blob/unicode-id-op/proposals/NNNN-refining-identifier-and-operator-symbology.md#detailed-design" style="box-sizing:border-box;background-color:transparent;color:rgb(64,120,192);text-decoration:none;float:left;padding-right:4px;line-height:1" target="_blank"></a>Detailed design</h2><h3 style="box-sizing:border-box;margin-top:24px;margin-bottom:16px;font-size:1.25em;line-height:1.25;color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;" class="gmail_msg"><a id="m_-8343617951962145237gmail-user-content-identifiers" class="m_-8343617951962145237gmail-anchor gmail_msg" href="https://github.com/jtbandes/swift-evolution/blob/unicode-id-op/proposals/NNNN-refining-identifier-and-operator-symbology.md#identifiers" style="box-sizing:border-box;background-color:transparent;color:rgb(64,120,192);text-decoration:none;float:left;padding-right:4px;line-height:1" target="_blank"></a>Identifiers</h3><p style="box-sizing:border-box;margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:16px" class="gmail_msg">Swift identifier characters will <a href="http://unicode.org/reports/tr31/#Conformance" style="box-sizing:border-box;background-color:transparent;color:rgb(64,120,192);text-decoration:none" class="gmail_msg" target="_blank">conform to UAX #31</a> as follows:</p><ul style="box-sizing:border-box;padding-left:2em;margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:16px" class="gmail_msg"><li style="box-sizing:border-box" class="gmail_msg"><p style="box-sizing:border-box;margin-top:16px;margin-bottom:16px" class="gmail_msg"><a href="http://unicode.org/reports/tr31/#C1" style="box-sizing:border-box;background-color:transparent;color:rgb(64,120,192);text-decoration:none" class="gmail_msg" target="_blank"><span style="box-sizing:border-box;font-weight:600" class="gmail_msg">UAX31-C1.</span></a> The conformance described herein refers to the Unicode 9.0.0 version of UAX #31 (dated 2016-05-31 and retrieved 2016-10-09).</p></li><li style="box-sizing:border-box;margin-top:0.25em" class="gmail_msg"><p style="box-sizing:border-box;margin-top:16px;margin-bottom:16px" class="gmail_msg"><a href="http://unicode.org/reports/tr31/#C2" style="box-sizing:border-box;background-color:transparent;color:rgb(64,120,192);text-decoration:none" class="gmail_msg" target="_blank"><span style="box-sizing:border-box;font-weight:600" class="gmail_msg">UAX31-C2.</span></a> Swift shall observe the following requirements:</p><ul style="box-sizing:border-box;padding-left:2em;margin-top:0px;margin-bottom:0px" class="gmail_msg"><li style="box-sizing:border-box" class="gmail_msg"><p style="box-sizing:border-box;margin-top:16px;margin-bottom:16px" class="gmail_msg"><a href="http://unicode.org/reports/tr31/#R1" style="box-sizing:border-box;background-color:transparent;color:rgb(64,120,192);text-decoration:none" class="gmail_msg" target="_blank"><span style="box-sizing:border-box;font-weight:600" class="gmail_msg">UAX31-R1.</span></a> Swift shall augment the definition of &quot;Default Identifiers&quot; with the following <span style="box-sizing:border-box;font-weight:600" class="gmail_msg">profiles</span>:</p><ol style="box-sizing:border-box;padding-left:2em;margin-top:0px;margin-bottom:0px;list-style-type:lower-alpha" class="gmail_msg"><li style="box-sizing:border-box" class="gmail_msg"><p style="box-sizing:border-box;margin-top:16px;margin-bottom:16px" class="gmail_msg"><code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">ID_Start</code> and <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">ID_Continue</code> shall be used for <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">Start</code> and <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">Continue</code> (replacing <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">XID_Start</code> and <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">XID_Continue</code>). This <span style="box-sizing:border-box;font-weight:600" class="gmail_msg">excludes</span> characters in <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">Other_ID_Start</code> and <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">Other_ID_Continue</code>.</p></li><li style="box-sizing:border-box;margin-top:0.25em" class="gmail_msg"><p style="box-sizing:border-box;margin-top:16px;margin-bottom:16px" class="gmail_msg">_ 005F LOW LINE shall additionally be allowed as a <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">Start</code> character.</p></li><li style="box-sizing:border-box;margin-top:0.25em" class="gmail_msg"><p style="box-sizing:border-box;margin-top:16px;margin-bottom:16px" class="gmail_msg">The emoji characters <span style="box-sizing:border-box;font-family:&quot;apple color emoji&quot;,&quot;segoe ui&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:21px;line-height:20px;vertical-align:middle;margin-right:0px" class="gmail_msg">🐶</span> 1F436 DOG FACE and <span style="box-sizing:border-box;font-family:&quot;apple color emoji&quot;,&quot;segoe ui&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:21px;line-height:20px;vertical-align:middle;margin-right:0px" class="gmail_msg">🐮</span> 1F42E COW FACE shall be allowed as <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">Start</code> and <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">Continue</code> characters.</p></li><li style="box-sizing:border-box;margin-top:0.25em" class="gmail_msg"><p style="box-sizing:border-box;margin-top:16px;margin-bottom:16px" class="gmail_msg">(<a href="http://unicode.org/reports/tr31/#R1a" style="box-sizing:border-box;background-color:transparent;color:rgb(64,120,192);text-decoration:none" class="gmail_msg" target="_blank"><span style="box-sizing:border-box;font-weight:600" class="gmail_msg">UAX31-R1a.</span></a>) The join-control characters ZWJ and ZWNJ are strictly limited to the special cases A1, A2, and B described in UAX #31. (This requirement is covered in the <a href="https://github.com/apple/swift-evolution/pull/531" style="box-sizing:border-box;background-color:transparent;color:rgb(64,120,192);text-decoration:none" class="gmail_msg" target="_blank">Normalize Unicode Identifiers proposal</a>.)</p></li></ol></li><li style="box-sizing:border-box;margin-top:0.25em" class="gmail_msg"><p style="box-sizing:border-box;margin-top:16px;margin-bottom:16px" class="gmail_msg"><a href="http://unicode.org/reports/tr31/#R4" style="box-sizing:border-box;background-color:transparent;color:rgb(64,120,192);text-decoration:none" class="gmail_msg" target="_blank"><span style="box-sizing:border-box;font-weight:600" class="gmail_msg">UAX31-R4.</span></a> Swift shall consider two identifiers equivalent when they have the same normalized form under <a href="http://unicode.org/reports/tr15/" style="box-sizing:border-box;background-color:transparent;color:rgb(64,120,192);text-decoration:none" class="gmail_msg" target="_blank"><span style="box-sizing:border-box;font-weight:600" class="gmail_msg">NFC</span></a>. (This requirement is covered in the <a href="https://github.com/apple/swift-evolution/pull/531" style="box-sizing:border-box;background-color:transparent;color:rgb(64,120,192);text-decoration:none" class="gmail_msg" target="_blank">Normalize Unicode Identifiers proposal</a>.)</p></li></ul></li></ul><p style="box-sizing:border-box;margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:16px" class="gmail_msg"><a href="http://unicode.org/cldr/utility/unicodeset.jsp?a=%5B%5Ba-zA-Z_%5Cu00A8%5Cu00AA%5Cu00AD%5Cu00AF%5Cu00B2-%5Cu00B5%5Cu00B7-%5Cu00BA%5Cu00BC-%5Cu00BE%5Cu00C0-%5Cu00D6%5Cu00D8-%5Cu00F6%5Cu00F8-%5Cu00FF%5Cu0100-%5Cu02FF%5Cu0370-%5Cu167F%5Cu1681-%5Cu180D%5Cu180F-%5Cu1DBF%5Cu1E00-%5Cu1FFF%5Cu200B-%5Cu200D%5Cu202A-%5Cu202E%5Cu203F-%5Cu2040%5Cu2054%5Cu2060-%5Cu206F%5Cu2070-%5Cu20CF%5Cu2100-%5Cu218F%5Cu2460-%5Cu24FF%5Cu2776-%5Cu2793%5Cu2C00-%5Cu2DFF%5Cu2E80-%5Cu2FFF%5Cu3004-%5Cu3007%5Cu3021-%5Cu302F%5Cu3031-%5Cu303F%5Cu3040-%5CuD7FF%5CuF900-%5CuFD3D%5CuFD40-%5CuFDCF%5CuFDF0-%5CuFE1F%5CuFE30-%5CuFE44%5CuFE47-%5CuFFFD%5CU00010000-%5CU0001FFFD%5CU00020000-%5CU0002FFFD%5CU00030000-%5CU0003FFFD%5CU000E0000-%5CU000EFFFD%5D%5B0-9%5Cu0300-%5Cu036F%5Cu1DC0-%5Cu1DFF%5Cu20D0-%5Cu20FF%5CuFE20-%5CuFE2F%5D%5D&amp;b=%5B%5B:ID_Continue:%5D%5CU0001F436%5CU0001F42E%5D" style="box-sizing:border-box;background-color:transparent;color:rgb(64,120,192);text-decoration:none" class="gmail_msg" target="_blank">These changes</a> result in the removal of some 5,500 valid code points from the identifier characters, as well as hundreds of thousands of unassigned code points. (Though it does not appear on this <a href="http://unicode.org/" class="gmail_msg" target="_blank">unicode.org</a> utility, which currently supports only Unicode 8 data, the · 00B7 MIDDLE DOT is no longer an identifier character.) Adopting <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">ID_Start</code> and <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">ID_Continue</code> does not add any new identifier characters.</p><h4 style="box-sizing:border-box;margin-top:24px;margin-bottom:16px;font-size:16px;line-height:1.25;color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;" class="gmail_msg"><a id="m_-8343617951962145237gmail-user-content-grammar-changes" class="m_-8343617951962145237gmail-anchor gmail_msg" href="https://github.com/jtbandes/swift-evolution/blob/unicode-id-op/proposals/NNNN-refining-identifier-and-operator-symbology.md#grammar-changes" style="box-sizing:border-box;background-color:transparent;color:rgb(64,120,192);text-decoration:none;float:left;padding-right:4px;line-height:1" target="_blank"></a>Grammar changes</h4><pre style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;margin-top:0px;margin-bottom:16px;font-stretch:normal;line-height:1.45;word-wrap:normal;padding:16px;overflow:auto;background-color:rgb(247,247,247);border-radius:3px;color:rgb(51,51,51)" class="gmail_msg"><code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0px;margin:0px;background-image:initial;background-position:initial;background-size:initial;background-repeat:initial;background-origin:initial;background-clip:initial;background-color:transparent;border-radius:3px;word-break:normal;border:0px;display:inline;overflow:visible;line-height:inherit;word-wrap:normal" class="gmail_msg">identifier-head → [:ID_Start:]
identifier-head → _ 🐶 🐮
identifier-character → identifier-head
identifier-character → [:ID_Continue:]
</code></pre><h3 style="box-sizing:border-box;margin-top:24px;margin-bottom:16px;font-size:1.25em;line-height:1.25;color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;" class="gmail_msg"><a id="m_-8343617951962145237gmail-user-content-operators" class="m_-8343617951962145237gmail-anchor gmail_msg" href="https://github.com/jtbandes/swift-evolution/blob/unicode-id-op/proposals/NNNN-refining-identifier-and-operator-symbology.md#operators" style="box-sizing:border-box;background-color:transparent;color:rgb(64,120,192);text-decoration:none;float:left;padding-right:4px;line-height:1" target="_blank"></a>Operators</h3><p style="box-sizing:border-box;margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:16px" class="gmail_msg">Swift operator characters will be limited to <span style="box-sizing:border-box;font-weight:600" class="gmail_msg">only</span> the following ASCII characters:</p><p style="box-sizing:border-box;margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:16px" class="gmail_msg">! % &amp; * + - . / &lt; = &gt; ? ^ | ~</p><p style="box-sizing:border-box;margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:16px" class="gmail_msg">The current restrictions on reserved tokens and operators <span style="box-sizing:border-box;font-weight:600" class="gmail_msg">will remain</span>: <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">=</code>, <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">-&gt;</code>, <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">//</code>, <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">/*</code>, <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">*/</code>, <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">.</code>, <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">?</code>, prefix <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">&lt;</code>, prefix <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">&amp;</code>, postfix <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">&gt;</code>, and postfix <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">!</code> are reserved.</p><h4 style="box-sizing:border-box;margin-top:24px;margin-bottom:16px;font-size:16px;line-height:1.25;color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;" class="gmail_msg"><a id="m_-8343617951962145237gmail-user-content-dots-in-operators" class="m_-8343617951962145237gmail-anchor gmail_msg" href="https://github.com/jtbandes/swift-evolution/blob/unicode-id-op/proposals/NNNN-refining-identifier-and-operator-symbology.md#dots-in-operators" style="box-sizing:border-box;background-color:transparent;color:rgb(64,120,192);text-decoration:none;float:left;padding-right:4px;line-height:1" target="_blank"></a>Dots in operators</h4><p style="box-sizing:border-box;margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:16px" class="gmail_msg">The current requirements for dots in operator names are:</p><blockquote style="box-sizing:border-box;margin:0px 0px 16px;padding:0px 1em;color:rgb(119,119,119);border-left:0.25em solid rgb(221,221,221);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:16px" class="gmail_msg"><div style="box-sizing:border-box;margin-top:0px;margin-bottom:0px" class="gmail_msg">If an operator doesn’t begin with a dot, it can’t contain a dot elsewhere.</div></blockquote><p style="box-sizing:border-box;margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:16px" class="gmail_msg">This proposal <span style="box-sizing:border-box;font-weight:600" class="gmail_msg">changes the rule</span> to:</p><blockquote style="box-sizing:border-box;margin:0px 0px 16px;padding:0px 1em;color:rgb(119,119,119);border-left:0.25em solid rgb(221,221,221);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:16px" class="gmail_msg"><div style="box-sizing:border-box;margin-top:0px;margin-bottom:0px" class="gmail_msg">Dots may only appear in operators in runs of two or more.</div></blockquote><p style="box-sizing:border-box;margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:16px" class="gmail_msg">Under the revised rule, <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">..&lt;</code> and <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">...</code> are allowed, but <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">&lt;.&lt;</code> is not. We also <span style="box-sizing:border-box;font-weight:600" class="gmail_msg">reserve the <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">..</code> operator</span>, permitting the compiler to use <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">..</code> for a &quot;method cascade&quot; syntax in the future, as <a href="http://news.dartlang.org/2012/02/method-cascades-in-dart-posted-by-gilad.html" style="box-sizing:border-box;background-color:transparent;color:rgb(64,120,192);text-decoration:none" class="gmail_msg" target="_blank">supported by Dart</a>.</p><p style="box-sizing:border-box;margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:16px" class="gmail_msg">Motivations for incorporating the two-dot rule are:</p><ul style="box-sizing:border-box;padding-left:2em;margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:16px" class="gmail_msg"><li style="box-sizing:border-box" class="gmail_msg"><p style="box-sizing:border-box;margin-top:16px;margin-bottom:16px" class="gmail_msg">It helps avoid future lexical complications arising from lone <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">.</code>s.</p></li><li style="box-sizing:border-box;margin-top:0.25em" class="gmail_msg"><p style="box-sizing:border-box;margin-top:16px;margin-bottom:16px" class="gmail_msg">It&#39;s a conservative approach, erring towards overly restrictive. Dropping the rule in future (thereby allowing single dots) may be possible.</p></li><li style="box-sizing:border-box;margin-top:0.25em" class="gmail_msg"><p style="box-sizing:border-box;margin-top:16px;margin-bottom:16px" class="gmail_msg">It doesn&#39;t require special cases for existing infix dot operators in the standard library, <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">...</code> (closed range) and <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">..&lt;</code> (half-open range). It also leaves the door open for the standard library to add analogous half-open and fully-open range operators <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">&lt;..</code> and <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">&lt;..&lt;</code>.</p></li><li style="box-sizing:border-box;margin-top:0.25em" class="gmail_msg"><p style="box-sizing:border-box;margin-top:16px;margin-bottom:16px" class="gmail_msg">If we fail to adopt this rule now, then future backward-compatibility requirements will preclude the introduction of some potentially useful language enhancements.</p></li></ul><h4 style="box-sizing:border-box;margin-top:24px;margin-bottom:16px;font-size:16px;line-height:1.25;color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;" class="gmail_msg"><a id="m_-8343617951962145237gmail-user-content-grammar-changes-1" class="m_-8343617951962145237gmail-anchor gmail_msg" href="https://github.com/jtbandes/swift-evolution/blob/unicode-id-op/proposals/NNNN-refining-identifier-and-operator-symbology.md#grammar-changes-1" style="box-sizing:border-box;background-color:transparent;color:rgb(64,120,192);text-decoration:none;float:left;padding-right:4px;line-height:1" target="_blank"></a>Grammar changes</h4><pre style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;margin-top:0px;margin-bottom:16px;font-stretch:normal;line-height:1.45;word-wrap:normal;padding:16px;overflow:auto;background-color:rgb(247,247,247);border-radius:3px;color:rgb(51,51,51)" class="gmail_msg"><code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0px;margin:0px;background-image:initial;background-position:initial;background-size:initial;background-repeat:initial;background-origin:initial;background-clip:initial;background-color:transparent;border-radius:3px;word-break:normal;border:0px;display:inline;overflow:visible;line-height:inherit;word-wrap:normal" class="gmail_msg">operator → operator-head operator-characters[opt]

operator-head → ! % &amp; * + - / &lt; = &gt; ? ^ | ~
operator-head → operator-dot operator-dots
operator-character → operator-head
operator-characters → operator-character operator-character[opt]

operator-dot → .
operator-dots → operator-dot operator-dots[opt]
</code></pre><h3 style="box-sizing:border-box;margin-top:24px;margin-bottom:16px;font-size:1.25em;line-height:1.25;color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;" class="gmail_msg"><a id="m_-8343617951962145237gmail-user-content-emoji" class="m_-8343617951962145237gmail-anchor gmail_msg" href="https://github.com/jtbandes/swift-evolution/blob/unicode-id-op/proposals/NNNN-refining-identifier-and-operator-symbology.md#emoji" style="box-sizing:border-box;background-color:transparent;color:rgb(64,120,192);text-decoration:none;float:left;padding-right:4px;line-height:1" target="_blank"></a>Emoji</h3><p style="box-sizing:border-box;margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:16px" class="gmail_msg">If adopted, this proposal eliminates emoji from Swift identifiers and operators. Despite their novelty and utility, emoji characters introduce significant challenges to the language:</p><ul style="box-sizing:border-box;padding-left:2em;margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:16px" class="gmail_msg"><li style="box-sizing:border-box" class="gmail_msg"><p style="box-sizing:border-box;margin-top:16px;margin-bottom:16px" class="gmail_msg">Their categorization into identifiers and operators is not semantically motivated, and is fraught with discrepancies.</p></li><li style="box-sizing:border-box;margin-top:0.25em" class="gmail_msg"><p style="box-sizing:border-box;margin-top:16px;margin-bottom:16px" class="gmail_msg">Emoji characters are not displayed consistently and uniformly across different systems and fonts. Including <a href="http://unicode.org/cldr/utility/list-unicodeset.jsp?a=%5B%3AEmoji%3A%5D" style="box-sizing:border-box;background-color:transparent;color:rgb(64,120,192);text-decoration:none" class="gmail_msg" target="_blank">all Unicode emoji</a> introduces characters that don&#39;t render as emoji on Apple platforms without a variant selector, but which also wouldn&#39;t normally be used as identifier characters (e.g. ⏏ ▪ ▫).</p></li><li style="box-sizing:border-box;margin-top:0.25em" class="gmail_msg"><p style="box-sizing:border-box;margin-top:16px;margin-bottom:16px" class="gmail_msg">Some emoji nearly overlap with existing operator syntax: <span style="box-sizing:border-box;font-family:&quot;apple color emoji&quot;,&quot;segoe ui&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:21px;line-height:20px;vertical-align:middle;margin-right:0px" class="gmail_msg">❗️</span><span style="box-sizing:border-box;font-family:&quot;apple color emoji&quot;,&quot;segoe ui&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:21px;line-height:20px;vertical-align:middle;margin-right:0px" class="gmail_msg">❓</span><span style="box-sizing:border-box;font-family:&quot;apple color emoji&quot;,&quot;segoe ui&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:21px;line-height:20px;vertical-align:middle;margin-right:0px" class="gmail_msg">➕</span><span style="box-sizing:border-box;font-family:&quot;apple color emoji&quot;,&quot;segoe ui&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:21px;line-height:20px;vertical-align:middle;margin-right:0px" class="gmail_msg">➖</span><span style="box-sizing:border-box;font-family:&quot;apple color emoji&quot;,&quot;segoe ui&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:21px;line-height:20px;vertical-align:middle;margin-right:0px" class="gmail_msg">➗</span><span style="box-sizing:border-box;font-family:&quot;apple color emoji&quot;,&quot;segoe ui&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:21px;line-height:20px;vertical-align:middle;margin-right:0px" class="gmail_msg">✖️</span></p></li><li style="box-sizing:border-box;margin-top:0.25em" class="gmail_msg"><p style="box-sizing:border-box;margin-top:16px;margin-bottom:16px" class="gmail_msg">Full emoji support necessitates handling a variety of use cases for joining characters and variant selectors, which would not otherwise be useful in most cases. It would be hard to avoid permitting sequences of characters which aren&#39;t valid emoji, or being overly restrictive and not properly supporting emoji introduced in future versions of Unicode.</p></li></ul><p style="box-sizing:border-box;margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:16px" class="gmail_msg">As an exception, in homage to Swift&#39;s origins, we permit <span style="box-sizing:border-box;font-family:&quot;apple color emoji&quot;,&quot;segoe ui&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:21px;line-height:20px;vertical-align:middle;margin-right:0px" class="gmail_msg">🐶</span> and <span style="box-sizing:border-box;font-family:&quot;apple color emoji&quot;,&quot;segoe ui&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:21px;line-height:20px;vertical-align:middle;margin-right:0px" class="gmail_msg">🐮</span> in identifiers.</p><h2 style="box-sizing:border-box;margin-top:24px;margin-bottom:16px;line-height:1.25;padding-bottom:0.3em;border-bottom:1px solid rgb(238,238,238);color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;" class="gmail_msg"><a id="m_-8343617951962145237gmail-user-content-source-compatibility" class="m_-8343617951962145237gmail-anchor gmail_msg" href="https://github.com/jtbandes/swift-evolution/blob/unicode-id-op/proposals/NNNN-refining-identifier-and-operator-symbology.md#source-compatibility" style="box-sizing:border-box;background-color:transparent;color:rgb(64,120,192);text-decoration:none;float:left;padding-right:4px;line-height:1" target="_blank"></a>Source compatibility</h2><p style="box-sizing:border-box;margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:16px" class="gmail_msg">This change is source-breaking in cases where developers have incorporated emoji or custom non-ASCII operators, or identifiers with characters which have been disallowed. This is unlikely to be a significant breakage for the majority of serious Swift code.</p><p style="box-sizing:border-box;margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:16px" class="gmail_msg">Code using the middle dot <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">·</code> in identifiers may be slightly more common. <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">·</code> is now disallowed entirely.</p><p style="box-sizing:border-box;margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:16px" class="gmail_msg">Diagnostics for invalid characters are already produced today. We can improve them easily if needed.</p><p style="box-sizing:border-box;margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:16px" class="gmail_msg">Maintaining source compatibility for Swift 3 should be easy: just keep the old parsing &amp; identifier lookup code.</p><h2 style="box-sizing:border-box;margin-top:24px;margin-bottom:16px;line-height:1.25;padding-bottom:0.3em;border-bottom:1px solid rgb(238,238,238);color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;" class="gmail_msg"><a id="m_-8343617951962145237gmail-user-content-effect-on-abi-stability" class="m_-8343617951962145237gmail-anchor gmail_msg" href="https://github.com/jtbandes/swift-evolution/blob/unicode-id-op/proposals/NNNN-refining-identifier-and-operator-symbology.md#effect-on-abi-stability" style="box-sizing:border-box;background-color:transparent;color:rgb(64,120,192);text-decoration:none;float:left;padding-right:4px;line-height:1" target="_blank"></a>Effect on ABI stability</h2><p style="box-sizing:border-box;margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:16px" class="gmail_msg">This proposal does not affect the ABI format itself, although the <a href="https://github.com/apple/swift-evolution/pull/531" style="box-sizing:border-box;background-color:transparent;color:rgb(64,120,192);text-decoration:none" class="gmail_msg" target="_blank">Normalize Unicode Identifiers proposal</a> affects the ABI of compiled modules.</p><p style="box-sizing:border-box;margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:16px" class="gmail_msg">The standard library will not be affected; it uses ASCII symbols with no combining characters.</p><h2 style="box-sizing:border-box;margin-top:24px;margin-bottom:16px;line-height:1.25;padding-bottom:0.3em;border-bottom:1px solid rgb(238,238,238);color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;" class="gmail_msg"><a id="m_-8343617951962145237gmail-user-content-effect-on-api-resilience" class="m_-8343617951962145237gmail-anchor gmail_msg" href="https://github.com/jtbandes/swift-evolution/blob/unicode-id-op/proposals/NNNN-refining-identifier-and-operator-symbology.md#effect-on-api-resilience" style="box-sizing:border-box;background-color:transparent;color:rgb(64,120,192);text-decoration:none;float:left;padding-right:4px;line-height:1" target="_blank"></a>Effect on API resilience</h2><p style="box-sizing:border-box;margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:16px" class="gmail_msg">This proposal doesn&#39;t affect API resilience.</p><h2 style="box-sizing:border-box;margin-top:24px;margin-bottom:16px;line-height:1.25;padding-bottom:0.3em;border-bottom:1px solid rgb(238,238,238);color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;" class="gmail_msg"><a id="m_-8343617951962145237gmail-user-content-alternatives-considered" class="m_-8343617951962145237gmail-anchor gmail_msg" href="https://github.com/jtbandes/swift-evolution/blob/unicode-id-op/proposals/NNNN-refining-identifier-and-operator-symbology.md#alternatives-considered" style="box-sizing:border-box;background-color:transparent;color:rgb(64,120,192);text-decoration:none;float:left;padding-right:4px;line-height:1" target="_blank"></a>Alternatives considered</h2><ul style="box-sizing:border-box;padding-left:2em;margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:16px" class="gmail_msg"><li style="box-sizing:border-box" class="gmail_msg"><p style="box-sizing:border-box;margin-top:16px;margin-bottom:16px" class="gmail_msg">Define operator characters using Unicode categories such as <a href="http://unicode.org/cldr/utility/list-unicodeset.jsp?a=%5B%5B%3ASm%3A%5D%5B%3ASo%3A%5D%5D" style="box-sizing:border-box;background-color:transparent;color:rgb(64,120,192);text-decoration:none" class="gmail_msg" target="_blank"><code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">Sm</code> and <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">So</code></a>. This approach would include many &quot;non-operator-like&quot; characters and doesn&#39;t seem to provide a significant benefit aside from a simpler definition.</p></li><li style="box-sizing:border-box;margin-top:0.25em" class="gmail_msg"><p style="box-sizing:border-box;margin-top:16px;margin-bottom:16px" class="gmail_msg">Hand-pick a set of &quot;operator-like&quot; characters to include. The proposal authors tried this painstaking approach, and came up with a relatively agreeable set of about <a href="http://unicode.org/cldr/utility/list-unicodeset.jsp?a=%5B%21%5C%24%25%5C%26*%2B%5C-%2F%3C%3D%3E%3F%5C%5E%7C%7E%0D%0A%0D%0A%5Cu00AC%0D%0A%5Cu00B1%0D%0A%5Cu00B7%0D%0A%5Cu00D7%0D%0A%5Cu00F7%0D%0A%0D%0A%5Cu2208-%5Cu220D%0D%0A%5Cu220F-%5Cu2211%0D%0A%5Cu22C0-%5Cu22C3%0D%0A%5Cu2212-%5Cu221D%0D%0A%5Cu2238%0D%0A%5Cu223A%0D%0A%5Cu2240%0D%0A%5Cu228C-%5Cu228E%0D%0A%5Cu2293-%5Cu22A3%0D%0A%5Cu22BA-%5Cu22BD%0D%0A%5Cu22C4-%5Cu22C7%0D%0A%5Cu22C9-%5Cu22CC%0D%0A%5Cu22D2-%5Cu22D3%0D%0A%5Cu2223-%5Cu222A%0D%0A%5Cu2236-%5Cu2237%0D%0A%5Cu2239%0D%0A%5Cu223B-%5Cu223E%0D%0A%5Cu2241-%5Cu228B%0D%0A%5Cu228F-%5Cu2292%0D%0A%5Cu22A6-%5Cu22B9%0D%0A%5Cu22C8%0D%0A%5Cu22CD%0D%0A%5Cu22D0-%5Cu22D1%0D%0A%5Cu22D4-%5Cu22FF%0D%0A%5Cu22CE-%5Cu22CF%0D%0A%0D%0A%5Cu2A00-%5Cu2AFF%0D%0A%0D%0A%5Cu27C2%0D%0A%5Cu27C3%0D%0A%5Cu27C4%0D%0A%5Cu27C7%0D%0A%5Cu27C8%0D%0A%5Cu27C9%0D%0A%5Cu27CA%0D%0A%5Cu27CE-%5Cu27D7%0D%0A%5Cu27DA-%5Cu27DF%0D%0A%5Cu27E0-%5Cu27E5%0D%0A%0D%0A%5Cu29B5-%5Cu29C3%0D%0A%5Cu29C4-%5Cu29C9%0D%0A%5Cu29CA-%5Cu29D0%0D%0A%5Cu29D1-%5Cu29D7%0D%0A%5Cu29DF%0D%0A%5Cu29E1%0D%0A%5Cu29E2%0D%0A%5Cu29E3-%5Cu29E6%0D%0A%5Cu29FA%0D%0A%5Cu29FB%0D%0A%0D%0A%5Cu2308-%5Cu230B%0D%0A%5Cu2336-%5Cu237A%0D%0A%5Cu2395%5D" style="box-sizing:border-box;background-color:transparent;color:rgb(64,120,192);text-decoration:none" class="gmail_msg" target="_blank">650 code points</a> (although this set would require further refinement), but ultimately felt the motivation for including non-ASCII operators is much lower than for identifiers, and the harm to readers/writers of programs outweighs their potential utility.</p></li><li style="box-sizing:border-box;margin-top:0.25em" class="gmail_msg"><p style="box-sizing:border-box;margin-top:16px;margin-bottom:16px" class="gmail_msg">Use Normalization Form KC (NFKC) instead of NFC. The decision to use NFC comes from <a href="https://github.com/apple/swift-evolution/pull/531" style="box-sizing:border-box;background-color:transparent;color:rgb(64,120,192);text-decoration:none" class="gmail_msg" target="_blank">Normalize Unicode Identifiers proposal</a>. Also, UAX #31 states:</p><blockquote style="box-sizing:border-box;margin:0px 0px 16px;padding:0px 1em;color:rgb(119,119,119);border-left:0.25em solid rgb(221,221,221)" class="gmail_msg"><div style="box-sizing:border-box;margin-top:0px;margin-bottom:0px" class="gmail_msg">Generally if the programming language has case-sensitive identifiers, then Normalization Form C is appropriate; whereas, if the programming language has case-insensitive identifiers, then Normalization Form KC is more appropriate.</div></blockquote><p style="box-sizing:border-box;margin-top:16px;margin-bottom:16px" class="gmail_msg">NFKC may also produce surprising results; for example, &quot;ſ&quot; and &quot;s&quot; are equivalent under NFKC.</p></li><li style="box-sizing:border-box;margin-top:0.25em" class="gmail_msg"><p style="box-sizing:border-box;margin-top:16px;margin-bottom:16px" class="gmail_msg">Continue to allow single <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">.</code>s in operators, and perhaps even expand the original rule to allow them anywhere (even if the operator does not begin with <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">.</code>).</p><p style="box-sizing:border-box;margin-top:16px;margin-bottom:16px" class="gmail_msg">This would allow a wider variety of custom operators (for some interesting possibilities, see the operators in Haskell&#39;s <a href="https://github.com/ekmett/lens/wiki/Operators" style="box-sizing:border-box;background-color:transparent;color:rgb(64,120,192);text-decoration:none" class="gmail_msg" target="_blank">Lens</a> package). However, there are a handful of potential complications:</p><ul style="box-sizing:border-box;padding-left:2em;margin-top:0px;margin-bottom:0px" class="gmail_msg"><li style="box-sizing:border-box" class="gmail_msg"><p style="box-sizing:border-box;margin-top:16px;margin-bottom:16px" class="gmail_msg">Combining prefix or postfix operators with member access: <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">foo*.bar</code> would need to be parsed as <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">foo *. bar</code>rather than <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">(foo*).bar</code>. Parentheses could be required to disambiguate.</p></li><li style="box-sizing:border-box;margin-top:0.25em" class="gmail_msg"><p style="box-sizing:border-box;margin-top:16px;margin-bottom:16px" class="gmail_msg">Combining infix operators with contextual members: <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">foo*.bar</code> would need to be parsed as <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">foo *. bar</code> rather than <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">foo * (.bar)</code>. Whitespace or parentheses could be required to disambiguate.</p></li><li style="box-sizing:border-box;margin-top:0.25em" class="gmail_msg"><p style="box-sizing:border-box;margin-top:16px;margin-bottom:16px" class="gmail_msg">Hypothetically, if operators were accessible as members such as <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">MyNumber.+</code>, allowing operators with single <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">.</code>s would require escaping operator names (perhaps with backticks, such as <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">MyNumber.`+`</code>).</p></li></ul><p style="box-sizing:border-box;margin-top:16px;margin-bottom:16px" class="gmail_msg">This would also require operators of the form <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">[!?]*\.</code> (for example <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">.</code> <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">?.</code> <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">!.</code> <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">!!.</code>) to be reserved, to prevent users from defining custom operators that conflict with member access and optional chaining.</p><p style="box-sizing:border-box;margin-top:16px;margin-bottom:16px" class="gmail_msg">We believe that requiring dots to appear in groups of at least two, while in some ways more restrictive, will prevent a significant amount of future pain, and does not require special-case considerations such as the above.</p></li></ul><h2 style="box-sizing:border-box;margin-top:24px;margin-bottom:16px;line-height:1.25;padding-bottom:0.3em;border-bottom:1px solid rgb(238,238,238);color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;" class="gmail_msg"><a id="m_-8343617951962145237gmail-user-content-future-directions" class="m_-8343617951962145237gmail-anchor gmail_msg" href="https://github.com/jtbandes/swift-evolution/blob/unicode-id-op/proposals/NNNN-refining-identifier-and-operator-symbology.md#future-directions" style="box-sizing:border-box;background-color:transparent;color:rgb(64,120,192);text-decoration:none;float:left;padding-right:4px;line-height:1" target="_blank"></a>Future directions</h2><p style="box-sizing:border-box;margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:16px" class="gmail_msg">While not within the scope of this proposal, the following considerations may provide useful context for the proposed changes. We encourage the community to pick up these topics when the time is right.</p><ul style="box-sizing:border-box;padding-left:2em;margin-top:0px;color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,&quot;segoe ui&quot;,helvetica,arial,sans-serif,&quot;apple color emoji&quot;,&quot;segoe ui emoji&quot;,&quot;segoe ui symbol&quot;;font-size:16px;margin-bottom:0px" class="gmail_msg"><li style="box-sizing:border-box" class="gmail_msg"><p style="box-sizing:border-box;margin-top:16px;margin-bottom:16px" class="gmail_msg"><span style="box-sizing:border-box;font-weight:600" class="gmail_msg">Re-expand operators to allow some non-ASCII characters.</span> There is work in progress to update UAX #31 with definitions for &quot;operator identifiers&quot; — when this work is completed, it would be worth considering for Swift.</p></li><li style="box-sizing:border-box;margin-top:0.25em" class="gmail_msg"><p style="box-sizing:border-box;margin-top:16px;margin-bottom:16px" class="gmail_msg"><span style="box-sizing:border-box;font-weight:600" class="gmail_msg">Introduce a syntax for method cascades.</span> The Dart language supports <a href="http://news.dartlang.org/2012/02/method-cascades-in-dart-posted-by-gilad.html" style="box-sizing:border-box;background-color:transparent;color:rgb(64,120,192);text-decoration:none" class="gmail_msg" target="_blank">method cascades</a>, whereby multiple methods can be called on an object within one expression: <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">foo..bar()..baz()</code> effectively performs <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">foo.bar(); foo.baz()</code>. This syntax can also be used with assignments and subscripts. Such a feature might be very useful in Swift; this proposal reserves the <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">..</code> operator so that it may be added in the future.</p></li><li style="box-sizing:border-box;margin-top:0.25em" class="gmail_msg"><p style="box-sizing:border-box;margin-top:16px;margin-bottom:16px" class="gmail_msg"><span style="box-sizing:border-box;font-weight:600" class="gmail_msg">Introduce &quot;mixfix&quot; operator declarations.</span> Mixfix operators are based on pattern matching, and would allow more than two operands. For example, the ternary operator <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">? :</code> can be defined as a mixfix operator with three &quot;holes&quot;: <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">_ ? _ : _</code>. Subscripts might be subsumed by mixfix declarations such as <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">_ [ _ ]</code>. Some holes could be made <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">@autoclosure</code>, and there might even be holes whose argument is represented as an AST, rather than a value or thunk, supporting advanced metaprogramming (for instance, F#&#39;s <a href="https://docs.microsoft.com/en-us/dotnet/articles/fsharp/language-reference/code-quotations" style="box-sizing:border-box;background-color:transparent;color:rgb(64,120,192);text-decoration:none" class="gmail_msg" target="_blank">code quotations</a>).</p></li><li style="box-sizing:border-box;margin-top:0.25em" class="gmail_msg"><p style="box-sizing:border-box;margin-top:16px;margin-bottom:16px" class="gmail_msg"><span style="box-sizing:border-box;font-weight:600" class="gmail_msg">Diminish or remove the lexical distinction between operators and identifiers.</span> If precedence and fixity applied to traditional identifiers as well as operators, it would be possible to incorporate ASCII equivalents for standard operators (e.g. <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">and</code> for <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">&amp;&amp;</code>, to allow <code style="box-sizing:border-box;font-family:consolas,&quot;liberation mono&quot;,menlo,courier,monospace;font-size:13.6px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-radius:3px" class="gmail_msg">A and B</code>). If additionally combined with mixfix operator support, this might enable powerful DSLs (for instance, C#&#39;s <a href="https://en.wikipedia.org/wiki/Language_Integrated_Query" style="box-sizing:border-box;background-color:transparent;color:rgb(64,120,192);text-decoration:none" class="gmail_msg" target="_blank">LINQ</a>).</p></li></ul></div></div></div></div>
</div></div></blockquote></div></div><div style="word-wrap:break-word" class="gmail_msg"><div class="gmail_msg"><blockquote type="cite" class="gmail_msg"><div class="gmail_msg">
_______________________________________________</div></blockquote></div></div><div style="word-wrap:break-word" class="gmail_msg"><div class="gmail_msg"><blockquote type="cite" class="gmail_msg"><div class="gmail_msg"><br class="gmail_msg">swift-evolution mailing list<br class="gmail_msg"><a href="mailto:swift-evolution@swift.org" class="gmail_msg" target="_blank">swift-evolution@swift.org</a><br class="gmail_msg"><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" class="gmail_msg" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br class="gmail_msg"></div></blockquote></div></div>_______________________________________________<br class="gmail_msg">
swift-evolution mailing list<br class="gmail_msg">
<a href="mailto:swift-evolution@swift.org" class="gmail_msg" target="_blank">swift-evolution@swift.org</a><br class="gmail_msg">
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" class="gmail_msg" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br class="gmail_msg">
</blockquote></div>