<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">Strong -1 from me as currently written.</div><div class=""><br class=""></div><div class="">There is no reason to remove Emoji from identifiers, nor to restrict operators to ASCII only (especially since the corresponding UAX spec is still under construction). Emoji are just as much a part of modern communication as the Latin alphabet. Swift should not seek to restrict a userโs ability to express themselves.</div><div class=""><br class=""></div><div class="">Given the problems with operators restricting Emoji from operators seems reasonable. Prohibiting non-printing characters also makes sense.</div><div class=""><br class=""></div><div class=""><br class=""></div><div class="">Russ</div><div class=""><br class=""></div><div class=""><br class=""></div><div><blockquote type="cite" class=""><div class="">On Oct 18, 2016, at 11:34 PM, Jacob Bandes-Storch via swift-evolution <<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>> wrote:</div><div class=""><div dir="ltr" class=""><div class=""><div class="gmail_signature"><div dir="ltr" class=""><div class=""><br class=""></div><div class=""><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,"segoe ui",helvetica,arial,sans-serif,"apple color emoji","segoe ui emoji","segoe ui symbol"" class="">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,"segoe ui",helvetica,arial,sans-serif,"apple color emoji","segoe ui emoji","segoe ui symbol";font-size:16px" class=""><li style="box-sizing:border-box" class="">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="">SE-NNNN</a></li><li style="box-sizing:border-box;margin-top:0.25em" class="">Authors: <a href="https://github.com/jtbandes" style="box-sizing:border-box;background-color:transparent;color:rgb(64,120,192);text-decoration:none" class="">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="">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="">Xiaodi Wu</a>, Jonathan Shapiro</li><li style="box-sizing:border-box;margin-top:0.25em" class="">Review Manager: TBD</li><li style="box-sizing:border-box;margin-top:0.25em" class="">Status: <span style="box-sizing:border-box;font-weight:600" class="">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,"segoe ui",helvetica,arial,sans-serif,"apple color emoji","segoe ui emoji","segoe ui symbol"" class=""><a id="gmail-user-content-introduction" class="gmail-anchor" 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"></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,"segoe ui",helvetica,arial,sans-serif,"apple color emoji","segoe ui emoji","segoe ui symbol";font-size:16px" class="">This proposal seeks to refine and rationalize Swift'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,"segoe ui",helvetica,arial,sans-serif,"apple color emoji","segoe ui emoji","segoe ui symbol";font-size:16px" class=""><li style="box-sizing:border-box" class="">adopts the Unicode recommendation for identifier characters, with some minor exceptions;</li><li style="box-sizing:border-box;margin-top:0.25em" class="">restricts the legal operator set to the current ASCII operator characters;</li><li style="box-sizing:border-box;margin-top:0.25em" class="">changes where dots may appear in operators; and</li><li style="box-sizing:border-box;margin-top:0.25em" class="">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,"segoe ui",helvetica,arial,sans-serif,"apple color emoji","segoe ui emoji","segoe ui symbol"" class=""><a id="gmail-user-content-prior-discussion-threads--proposals" class="gmail-anchor" 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"></a></h3><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,"segoe ui",helvetica,arial,sans-serif,"apple color emoji","segoe ui emoji","segoe ui symbol"" class="">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,"segoe ui",helvetica,arial,sans-serif,"apple color emoji","segoe ui emoji","segoe ui symbol";font-size:16px" class="">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="">UAX #31 Identifier and Pattern Syntax</a>, deriving the sets of valid characters from <code style="box-sizing:border-box;font-family:consolas,"liberation mono",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="">ID_Start</code> and <code style="box-sizing:border-box;font-family:consolas,"liberation mono",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="">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,"segoe ui",helvetica,arial,sans-serif,"apple color emoji","segoe ui emoji","segoe ui symbol";font-size:16px" class="">(For operators, no such recommendation currently exists, although active work is in progress to update UAX #31 to address "operator identifiers".)</p><p style="box-sizing:border-box;margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,"segoe ui",helvetica,arial,sans-serif,"apple color emoji","segoe ui emoji","segoe ui symbol";font-size:16px" class="">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,"segoe ui",helvetica,arial,sans-serif,"apple color emoji","segoe ui emoji","segoe ui symbol";font-size:16px" class="">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,"segoe ui",helvetica,arial,sans-serif,"apple color emoji","segoe ui emoji","segoe ui symbol";font-size:16px" class="">(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,"segoe ui",helvetica,arial,sans-serif,"apple color emoji","segoe ui emoji","segoe ui symbol"" class=""><a id="gmail-user-content-detailed-design" class="gmail-anchor" 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"></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,"segoe ui",helvetica,arial,sans-serif,"apple color emoji","segoe ui emoji","segoe ui symbol"" class=""><a id="gmail-user-content-identifiers" class="gmail-anchor" 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"></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,"segoe ui",helvetica,arial,sans-serif,"apple color emoji","segoe ui emoji","segoe ui symbol";font-size:16px" class="">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="">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,"segoe ui",helvetica,arial,sans-serif,"apple color emoji","segoe ui emoji","segoe ui symbol";font-size:16px" class=""><li style="box-sizing:border-box" class=""><p style="box-sizing:border-box;margin-top:16px;margin-bottom:16px" class=""><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=""><span style="box-sizing:border-box;font-weight:600" class="">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=""><p style="box-sizing:border-box;margin-top:16px;margin-bottom:16px" class=""><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=""><span style="box-sizing:border-box;font-weight:600" class="">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=""><li style="box-sizing:border-box" class=""><p style="box-sizing:border-box;margin-top:16px;margin-bottom:16px" class=""><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=""><span style="box-sizing:border-box;font-weight:600" class="">UAX31-R1.</span></a> Swift shall augment the definition of "Default Identifiers" with the following <span style="box-sizing:border-box;font-weight:600" class="">profiles</span>:</p><ol style="box-sizing:border-box;padding-left:2em;margin-top:0px;margin-bottom:0px;list-style-type:lower-alpha" class=""><li style="box-sizing:border-box" class=""><p style="box-sizing:border-box;margin-top:16px;margin-bottom:16px" class=""><code style="box-sizing:border-box;font-family:consolas,"liberation mono",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="">ID_Start</code> and <code style="box-sizing:border-box;font-family:consolas,"liberation mono",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="">ID_Continue</code> shall be used for <code style="box-sizing:border-box;font-family:consolas,"liberation mono",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="">Start</code> and <code style="box-sizing:border-box;font-family:consolas,"liberation mono",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="">Continue</code> (replacing <code style="box-sizing:border-box;font-family:consolas,"liberation mono",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="">XID_Start</code> and <code style="box-sizing:border-box;font-family:consolas,"liberation mono",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="">XID_Continue</code>). This <span style="box-sizing:border-box;font-weight:600" class="">excludes</span> characters in <code style="box-sizing:border-box;font-family:consolas,"liberation mono",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="">Other_ID_Start</code> and <code style="box-sizing:border-box;font-family:consolas,"liberation mono",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="">Other_ID_Continue</code>.</p></li><li style="box-sizing:border-box;margin-top:0.25em" class=""><p style="box-sizing:border-box;margin-top:16px;margin-bottom:16px" class="">_ 005F LOW LINE shall additionally be allowed as a <code style="box-sizing:border-box;font-family:consolas,"liberation mono",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="">Start</code> character.</p></li><li style="box-sizing:border-box;margin-top:0.25em" class=""><p style="box-sizing:border-box;margin-top:16px;margin-bottom:16px" class="">The emoji characters <span style="box-sizing:border-box;font-family:"apple color emoji","segoe ui","segoe ui emoji","segoe ui symbol";font-size:21px;line-height:20px;vertical-align:middle;margin-right:0px" class="">๐ถ</span> 1F436 DOG FACE and <span style="box-sizing:border-box;font-family:"apple color emoji","segoe ui","segoe ui emoji","segoe ui symbol";font-size:21px;line-height:20px;vertical-align:middle;margin-right:0px" class="">๐ฎ</span> 1F42E COW FACE shall be allowed as <code style="box-sizing:border-box;font-family:consolas,"liberation mono",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="">Start</code> and <code style="box-sizing:border-box;font-family:consolas,"liberation mono",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="">Continue</code> characters.</p></li><li style="box-sizing:border-box;margin-top:0.25em" class=""><p style="box-sizing:border-box;margin-top:16px;margin-bottom:16px" class="">(<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=""><span style="box-sizing:border-box;font-weight:600" class="">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="">Normalize Unicode Identifiers proposal</a>.)</p></li></ol></li><li style="box-sizing:border-box;margin-top:0.25em" class=""><p style="box-sizing:border-box;margin-top:16px;margin-bottom:16px" class=""><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=""><span style="box-sizing:border-box;font-weight:600" class="">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=""><span style="box-sizing:border-box;font-weight:600" class="">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="">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,"segoe ui",helvetica,arial,sans-serif,"apple color emoji","segoe ui emoji","segoe ui symbol";font-size:16px" class=""><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&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="">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="">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,"liberation mono",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="">ID_Start</code> and <code style="box-sizing:border-box;font-family:consolas,"liberation mono",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="">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,"segoe ui",helvetica,arial,sans-serif,"apple color emoji","segoe ui emoji","segoe ui symbol"" class=""><a id="gmail-user-content-grammar-changes" class="gmail-anchor" 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"></a>Grammar changes</h4><pre style="box-sizing:border-box;font-family:consolas,"liberation mono",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=""><code style="box-sizing:border-box;font-family:consolas,"liberation mono",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="">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,"segoe ui",helvetica,arial,sans-serif,"apple color emoji","segoe ui emoji","segoe ui symbol"" class=""><a id="gmail-user-content-operators" class="gmail-anchor" 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"></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,"segoe ui",helvetica,arial,sans-serif,"apple color emoji","segoe ui emoji","segoe ui symbol";font-size:16px" class="">Swift operator characters will be limited to <span style="box-sizing:border-box;font-weight:600" class="">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,"segoe ui",helvetica,arial,sans-serif,"apple color emoji","segoe ui emoji","segoe ui symbol";font-size:16px" class="">! % & * + - . / < = > ? ^ | ~</p><p style="box-sizing:border-box;margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:-apple-system,blinkmacsystemfont,"segoe ui",helvetica,arial,sans-serif,"apple color emoji","segoe ui emoji","segoe ui symbol";font-size:16px" class="">The current restrictions on reserved tokens and operators <span style="box-sizing:border-box;font-weight:600" class="">will remain</span>: <code style="box-sizing:border-box;font-family:consolas,"liberation mono",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="">=</code>, <code style="box-sizing:border-box;font-family:consolas,"liberation mono",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="">-></code>, <code style="box-sizing:border-box;font-family:consolas,"liberation mono",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="">//</code>, <code style="box-sizing:border-box;font-family:consolas,"liberation mono",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="">/*</code>, <code style="box-sizing:border-box;font-family:consolas,"liberation mono",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="">*/</code>, <code style="box-sizing:border-box;font-family:consolas,"liberation mono",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="">.</code>, <code style="box-sizing:border-box;font-family:consolas,"liberation mono",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="">?</code>, prefix <code style="box-sizing:border-box;font-family:consolas,"liberation mono",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=""><</code>, prefix <code style="box-sizing:border-box;font-family:consolas,"liberation mono",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="">&</code>, postfix <code style="box-sizing:border-box;font-family:consolas,"liberation mono",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="">></code>, and postfix <code style="box-sizing:border-box;font-family:consolas,"liberation mono",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="">!</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,"segoe ui",helvetica,arial,sans-serif,"apple color emoji","segoe ui emoji","segoe ui symbol"" class=""><a id="gmail-user-content-dots-in-operators" class="gmail-anchor" 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"></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,"segoe ui",helvetica,arial,sans-serif,"apple color emoji","segoe ui emoji","segoe ui symbol";font-size:16px" class="">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,"segoe ui",helvetica,arial,sans-serif,"apple color emoji","segoe ui emoji","segoe ui symbol";font-size:16px" class=""><div style="box-sizing: border-box; margin-top: 0px; margin-bottom: 0px;" class="">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,"segoe ui",helvetica,arial,sans-serif,"apple color emoji","segoe ui emoji","segoe ui symbol";font-size:16px" class="">This proposal <span style="box-sizing:border-box;font-weight:600" class="">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,"segoe ui",helvetica,arial,sans-serif,"apple color emoji","segoe ui emoji","segoe ui symbol";font-size:16px" class=""><div style="box-sizing: border-box; margin-top: 0px; margin-bottom: 0px;" class="">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,"segoe ui",helvetica,arial,sans-serif,"apple color emoji","segoe ui emoji","segoe ui symbol";font-size:16px" class="">Under the revised rule, <code style="box-sizing:border-box;font-family:consolas,"liberation mono",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="">..<</code> and <code style="box-sizing:border-box;font-family:consolas,"liberation mono",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="">...</code> are allowed, but <code style="box-sizing:border-box;font-family:consolas,"liberation mono",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=""><.<</code> is not. We also <span style="box-sizing:border-box;font-weight:600" class="">reserve the <code style="box-sizing:border-box;font-family:consolas,"liberation mono",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="">..</code> operator</span>, permitting the compiler to use <code style="box-sizing:border-box;font-family:consolas,"liberation mono",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="">..</code> for a "method cascade" 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="">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,"segoe ui",helvetica,arial,sans-serif,"apple color emoji","segoe ui emoji","segoe ui symbol";font-size:16px" class="">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,"segoe ui",helvetica,arial,sans-serif,"apple color emoji","segoe ui emoji","segoe ui symbol";font-size:16px" class=""><li style="box-sizing:border-box" class=""><p style="box-sizing:border-box;margin-top:16px;margin-bottom:16px" class="">It helps avoid future lexical complications arising from lone <code style="box-sizing:border-box;font-family:consolas,"liberation mono",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="">.</code>s.</p></li><li style="box-sizing:border-box;margin-top:0.25em" class=""><p style="box-sizing:border-box;margin-top:16px;margin-bottom:16px" class="">It'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=""><p style="box-sizing:border-box;margin-top:16px;margin-bottom:16px" class="">It doesn't require special cases for existing infix dot operators in the standard library, <code style="box-sizing:border-box;font-family:consolas,"liberation mono",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="">...</code> (closed range) and <code style="box-sizing:border-box;font-family:consolas,"liberation mono",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="">..<</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,"liberation mono",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=""><..</code> and <code style="box-sizing:border-box;font-family:consolas,"liberation mono",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=""><..<</code>.</p></li><li style="box-sizing:border-box;margin-top:0.25em" class=""><p style="box-sizing:border-box;margin-top:16px;margin-bottom:16px" class="">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,"segoe ui",helvetica,arial,sans-serif,"apple color emoji","segoe ui emoji","segoe ui symbol"" class=""><a id="gmail-user-content-grammar-changes-1" class="gmail-anchor" 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"></a>Grammar changes</h4><pre style="box-sizing:border-box;font-family:consolas,"liberation mono",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=""><code style="box-sizing:border-box;font-family:consolas,"liberation mono",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="">operator โ operator-head operator-characters[opt]
operator-head โ ! % & * + - / < = > ? ^ | ~
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,"segoe ui",helvetica,arial,sans-serif,"apple color emoji","segoe ui emoji","segoe ui symbol"" class=""><a id="gmail-user-content-emoji" class="gmail-anchor" 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"></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,"segoe ui",helvetica,arial,sans-serif,"apple color emoji","segoe ui emoji","segoe ui symbol";font-size:16px" class="">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></div></div></div></div></div></div></blockquote><div>I understand removing Emoji from operators but I object to removing them from identifiers. </div><div><br class=""></div><div><br class=""></div><br class=""><blockquote type="cite" class=""><div class=""><div dir="ltr" class=""><div class=""><div class="gmail_signature"><div dir="ltr" class=""><div class=""><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,"segoe ui",helvetica,arial,sans-serif,"apple color emoji","segoe ui emoji","segoe ui symbol";font-size:16px" class=""><li style="box-sizing:border-box" class=""><p style="box-sizing:border-box;margin-top:16px;margin-bottom:16px" class="">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=""><p style="box-sizing:border-box;margin-top:16px;margin-bottom:16px" class="">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="">all Unicode emoji</a> introduces characters that don't render as emoji on Apple platforms without a variant selector, but which also wouldn't normally be used as identifier characters (e.g. โ โช โซ).</p></li><li style="box-sizing:border-box;margin-top:0.25em" class=""><p style="box-sizing:border-box;margin-top:16px;margin-bottom:16px" class="">Some emoji nearly overlap with existing operator syntax: <span style="box-sizing:border-box;font-family:"apple color emoji","segoe ui","segoe ui emoji","segoe ui symbol";font-size:21px;line-height:20px;vertical-align:middle;margin-right:0px" class="">โ๏ธ</span><span style="box-sizing:border-box;font-family:"apple color emoji","segoe ui","segoe ui emoji","segoe ui symbol";font-size:21px;line-height:20px;vertical-align:middle;margin-right:0px" class="">โ</span><span style="box-sizing:border-box;font-family:"apple color emoji","segoe ui","segoe ui emoji","segoe ui symbol";font-size:21px;line-height:20px;vertical-align:middle;margin-right:0px" class="">โ</span><span style="box-sizing:border-box;font-family:"apple color emoji","segoe ui","segoe ui emoji","segoe ui symbol";font-size:21px;line-height:20px;vertical-align:middle;margin-right:0px" class="">โ</span><span style="box-sizing:border-box;font-family:"apple color emoji","segoe ui","segoe ui emoji","segoe ui symbol";font-size:21px;line-height:20px;vertical-align:middle;margin-right:0px" class="">โ</span><span style="box-sizing:border-box;font-family:"apple color emoji","segoe ui","segoe ui emoji","segoe ui symbol";font-size:21px;line-height:20px;vertical-align:middle;margin-right:0px" class="">โ๏ธ</span></p></li><li style="box-sizing:border-box;margin-top:0.25em" class=""><p style="box-sizing:border-box;margin-top:16px;margin-bottom:16px" class="">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'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,"segoe ui",helvetica,arial,sans-serif,"apple color emoji","segoe ui emoji","segoe ui symbol";font-size:16px" class="">As an exception, in homage to Swift's origins, we permit <span style="box-sizing:border-box;font-family:"apple color emoji","segoe ui","segoe ui emoji","segoe ui symbol";font-size:21px;line-height:20px;vertical-align:middle;margin-right:0px" class="">๐ถ</span> and <span style="box-sizing:border-box;font-family:"apple color emoji","segoe ui","segoe ui emoji","segoe ui symbol";font-size:21px;line-height:20px;vertical-align:middle;margin-right:0px" class="">๐ฎ</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,"segoe ui",helvetica,arial,sans-serif,"apple color emoji","segoe ui emoji","segoe ui symbol"" class=""><a id="gmail-user-content-source-compatibility" class="gmail-anchor" 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"></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,"segoe ui",helvetica,arial,sans-serif,"apple color emoji","segoe ui emoji","segoe ui symbol";font-size:16px" class="">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,"segoe ui",helvetica,arial,sans-serif,"apple color emoji","segoe ui emoji","segoe ui symbol";font-size:16px" class="">Code using the middle dot <code style="box-sizing:border-box;font-family:consolas,"liberation mono",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="">ยท</code> in identifiers may be slightly more common. <code style="box-sizing:border-box;font-family:consolas,"liberation mono",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="">ยท</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,"segoe ui",helvetica,arial,sans-serif,"apple color emoji","segoe ui emoji","segoe ui symbol";font-size:16px" class="">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,"segoe ui",helvetica,arial,sans-serif,"apple color emoji","segoe ui emoji","segoe ui symbol";font-size:16px" class="">Maintaining source compatibility for Swift 3 should be easy: just keep the old parsing & 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,"segoe ui",helvetica,arial,sans-serif,"apple color emoji","segoe ui emoji","segoe ui symbol"" class=""><a id="gmail-user-content-effect-on-abi-stability" class="gmail-anchor" 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"></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,"segoe ui",helvetica,arial,sans-serif,"apple color emoji","segoe ui emoji","segoe ui symbol";font-size:16px" class="">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="">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,"segoe ui",helvetica,arial,sans-serif,"apple color emoji","segoe ui emoji","segoe ui symbol";font-size:16px" class="">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,"segoe ui",helvetica,arial,sans-serif,"apple color emoji","segoe ui emoji","segoe ui symbol"" class=""><a id="gmail-user-content-effect-on-api-resilience" class="gmail-anchor" 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"></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,"segoe ui",helvetica,arial,sans-serif,"apple color emoji","segoe ui emoji","segoe ui symbol";font-size:16px" class="">This proposal doesn'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,"segoe ui",helvetica,arial,sans-serif,"apple color emoji","segoe ui emoji","segoe ui symbol"" class=""><a id="gmail-user-content-alternatives-considered" class="gmail-anchor" 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"></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,"segoe ui",helvetica,arial,sans-serif,"apple color emoji","segoe ui emoji","segoe ui symbol";font-size:16px" class=""><li style="box-sizing:border-box" class=""><p style="box-sizing:border-box;margin-top:16px;margin-bottom:16px" class="">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=""><code style="box-sizing:border-box;font-family:consolas,"liberation mono",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="">Sm</code> and <code style="box-sizing:border-box;font-family:consolas,"liberation mono",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="">So</code></a>. This approach would include many "non-operator-like" characters and doesn'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=""><p style="box-sizing:border-box;margin-top:16px;margin-bottom:16px" class="">Hand-pick a set of "operator-like" 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="">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=""><p style="box-sizing:border-box;margin-top:16px;margin-bottom:16px" class="">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="">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=""><div style="box-sizing: border-box; margin-top: 0px; margin-bottom: 0px;" class="">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="">NFKC may also produce surprising results; for example, "ลฟ" and "s" are equivalent under NFKC.</p></li><li style="box-sizing:border-box;margin-top:0.25em" class=""><p style="box-sizing:border-box;margin-top:16px;margin-bottom:16px" class="">Continue to allow single <code style="box-sizing:border-box;font-family:consolas,"liberation mono",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="">.</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,"liberation mono",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="">.</code>).</p><p style="box-sizing:border-box;margin-top:16px;margin-bottom:16px" class="">This would allow a wider variety of custom operators (for some interesting possibilities, see the operators in Haskell'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="">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=""><li style="box-sizing:border-box" class=""><p style="box-sizing:border-box;margin-top:16px;margin-bottom:16px" class="">Combining prefix or postfix operators with member access: <code style="box-sizing:border-box;font-family:consolas,"liberation mono",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="">foo*.bar</code> would need to be parsed as <code style="box-sizing:border-box;font-family:consolas,"liberation mono",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="">foo *. bar</code>rather than <code style="box-sizing:border-box;font-family:consolas,"liberation mono",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="">(foo*).bar</code>. Parentheses could be required to disambiguate.</p></li><li style="box-sizing:border-box;margin-top:0.25em" class=""><p style="box-sizing:border-box;margin-top:16px;margin-bottom:16px" class="">Combining infix operators with contextual members: <code style="box-sizing:border-box;font-family:consolas,"liberation mono",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="">foo*.bar</code> would need to be parsed as <code style="box-sizing:border-box;font-family:consolas,"liberation mono",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="">foo *. bar</code> rather than <code style="box-sizing:border-box;font-family:consolas,"liberation mono",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="">foo * (.bar)</code>. Whitespace or parentheses could be required to disambiguate.</p></li><li style="box-sizing:border-box;margin-top:0.25em" class=""><p style="box-sizing:border-box;margin-top:16px;margin-bottom:16px" class="">Hypothetically, if operators were accessible as members such as <code style="box-sizing:border-box;font-family:consolas,"liberation mono",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="">MyNumber.+</code>, allowing operators with single <code style="box-sizing:border-box;font-family:consolas,"liberation mono",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="">.</code>s would require escaping operator names (perhaps with backticks, such as <code style="box-sizing:border-box;font-family:consolas,"liberation mono",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="">MyNumber.`+`</code>).</p></li></ul><p style="box-sizing:border-box;margin-top:16px;margin-bottom:16px" class="">This would also require operators of the form <code style="box-sizing:border-box;font-family:consolas,"liberation mono",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="">[!?]*\.</code> (for example <code style="box-sizing:border-box;font-family:consolas,"liberation mono",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="">.</code> <code style="box-sizing:border-box;font-family:consolas,"liberation mono",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="">?.</code> <code style="box-sizing:border-box;font-family:consolas,"liberation mono",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="">!.</code> <code style="box-sizing:border-box;font-family:consolas,"liberation mono",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="">!!.</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="">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,"segoe ui",helvetica,arial,sans-serif,"apple color emoji","segoe ui emoji","segoe ui symbol"" class=""><a id="gmail-user-content-future-directions" class="gmail-anchor" 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"></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,"segoe ui",helvetica,arial,sans-serif,"apple color emoji","segoe ui emoji","segoe ui symbol";font-size:16px" class="">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,"segoe ui",helvetica,arial,sans-serif,"apple color emoji","segoe ui emoji","segoe ui symbol";font-size:16px;margin-bottom:0px" class=""><li style="box-sizing:border-box" class=""><p style="box-sizing:border-box;margin-top:16px;margin-bottom:16px" class=""><span style="box-sizing:border-box;font-weight:600" class="">Re-expand operators to allow some non-ASCII characters.</span> There is work in progress to update UAX #31 with definitions for "operator identifiers" โ 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=""><p style="box-sizing:border-box;margin-top:16px;margin-bottom:16px" class=""><span style="box-sizing:border-box;font-weight:600" class="">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="">method cascades</a>, whereby multiple methods can be called on an object within one expression: <code style="box-sizing:border-box;font-family:consolas,"liberation mono",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="">foo..bar()..baz()</code> effectively performs <code style="box-sizing:border-box;font-family:consolas,"liberation mono",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="">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,"liberation mono",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="">..</code> operator so that it may be added in the future.</p></li><li style="box-sizing:border-box;margin-top:0.25em" class=""><p style="box-sizing:border-box;margin-top:16px;margin-bottom:16px" class=""><span style="box-sizing:border-box;font-weight:600" class="">Introduce "mixfix" 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,"liberation mono",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="">? :</code> can be defined as a mixfix operator with three "holes": <code style="box-sizing:border-box;font-family:consolas,"liberation mono",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="">_ ? _ : _</code>. Subscripts might be subsumed by mixfix declarations such as <code style="box-sizing:border-box;font-family:consolas,"liberation mono",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="">_ [ _ ]</code>. Some holes could be made <code style="box-sizing:border-box;font-family:consolas,"liberation mono",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="">@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#'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="">code quotations</a>).</p></li><li style="box-sizing:border-box;margin-top:0.25em" class=""><p style="box-sizing:border-box;margin-top:16px;margin-bottom:16px" class=""><span style="box-sizing:border-box;font-weight:600" class="">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,"liberation mono",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="">and</code> for <code style="box-sizing:border-box;font-family:consolas,"liberation mono",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="">&&</code>, to allow <code style="box-sizing:border-box;font-family:consolas,"liberation mono",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="">A and B</code>). If additionally combined with mixfix operator support, this might enable powerful DSLs (for instance, C#'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="">LINQ</a>).</p></li></ul></div></div></div></div>
</div>
_______________________________________________<br class="">swift-evolution mailing list<br class=""><a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a><br class="">https://lists.swift.org/mailman/listinfo/swift-evolution<br class=""></div></blockquote></div><br class=""></body></html>