<div dir="ltr"><a href="https://github.com/Anton3/swift-evolution/blob/operator-precedence/proposals/NNNN-operator-precedence.md#use-precedence-groups">Added</a> group version, &quot;lessThan&quot; problem can be solved nicely. `&lt;`, `=`, `&gt;` signs would be allowed there.<div><br><div>&gt; <span style="font-size:12.8px">Should we allow &quot;precedence(... equalTo ...)&quot; for operators if we have precedence groups?</span></div></div><div><span style="font-size:12.8px">I think no.</span></div><div><span style="font-size:12.8px"><br></span></div><div><span style="font-size:12.8px">I have a question to your group syntax.</span></div><div><span style="font-size:12.8px">Since all operators in a precedence group must have equal associativity for parsing to work and look logically (right?), wouldn&#39;t it be better to declare associativity in groups?</span></div><div><span style="font-size:12.8px">If so, then body of operator declaration won&#39;t contain anything, and we can remove it:</span></div><div><span style="font-size:12.8px"><br></span></div><div><span style="font-size:12.8px">precedenceGroup Additive {</span></div><div><span style="font-size:12.8px">    associativity(left)</span></div><div><span style="font-size:12.8px">    +, -</span></div><div><span style="font-size:12.8px">}</span></div><div><span style="font-size:12.8px">infix operator +</span></div><div><span style="font-size:12.8px">infix operator -</span></div><div><span style="font-size:12.8px"><br></span></div><div><span style="font-size:12.8px">Does this body of precedenceGroup look OK from syntactic PoV?</span></div><div><span style="font-size:12.8px"><br></span></div><div><span style="font-size:12.8px">Now, I have another idea.</span></div><div><span style="font-size:12.8px">As operator declarations themselves don&#39;t contain anything anymore, remove operator declarations at all. We don&#39;t need to pre-declare function names, for example.</span></div><div><span style="font-size:12.8px">Next, `precedenceGroup` could be as well replaced with `precedenceLevel`, or just `precedence`, and I would not worry about additional keywords.</span></div><div><span style="font-size:12.8px">So, our example would look like this:</span></div><div><span style="font-size:12.8px"><br></span></div><div><span style="font-size:12.8px">precedence Additive {</span></div><div><span style="font-size:12.8px">    associativity(left)</span></div><div><span style="font-size:12.8px">    +, -</span></div><div><span style="font-size:12.8px">}</span></div><div>precedence Multiplicative {</div><div>    associativity(left)</div><div>    *, /</div><div>}</div><div>precedence(Additive &lt; Multiplicative)</div><div><br></div><div>As a future direction, we could add extensions to precedence levels.</div><div>We could go further and replace `precedence` with `operator`, abandoning the idea of priority for prefix and postfix operators (that I honestly don&#39;t like).</div><div><br></div><div>infix operator Additive {</div>    members(+, -)<div>    associativity(left)</div><div>}</div><div>infix operator Multiplicative {</div><div>    members(*, /)</div><div>    associativity(left)</div><div>    precedence(&gt; Additive)</div><div>}</div><div><br></div><div>Some other questions:</div><div>Do we need transitive precedence propagation?</div><div>Do we need resolution of conflicts, i.e. merging multiple definitions of same operators and groups, where possible?</div></div><div class="gmail_extra"><br><div class="gmail_quote">2016-04-05 22:52 GMT+03:00 Maximilian Hünenberger <span dir="ltr">&lt;<a href="mailto:m.huenenberger@me.com" target="_blank">m.huenenberger@me.com</a>&gt;</span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="auto"><div><span></span></div><div><span class=""><div></div><div><br></div><div>Am 05.04.2016 um 17:29 schrieb Антон Жилин &lt;<a href="mailto:antonyzhilin@gmail.com" target="_blank">antonyzhilin@gmail.com</a>&gt;:<br><br></div><blockquote type="cite"><div dir="ltr">David Waite stated a major drawback of precedence groups.<div><br></div><div>People will often create tiny precedence groups for their modules, and user will find that some of them should actually be the same. They will add precedenceEqualTo, but all these equivalent groups will still exist. This problem cannot occur with transitive precedence propagation. So precedence groups really create more problems than solve.</div><div><br></div><div>- Anton</div><div><br></div></div></blockquote><div><br></div></span><div><div><span style="background-color:rgba(255,255,255,0)">Do you mean these drawbacks?</span></div><span class=""><div><span style="background-color:rgba(255,255,255,0)"><br></span></div><div><span style="background-color:rgba(255,255,255,0)">&quot;</span></div><div><div></div><blockquote type="cite"><div><font color="#000000"><span style="background-color:rgba(255,255,255,0)">However, this may create more issues than it solves (two frameworks creating their own custom operators, putting them in custom precedence groups, and the consumer decides the two precedence groups are really equivalent)</span></font></div><div><font color="#000000"><span style="background-color:rgba(255,255,255,0)"><br></span></font></div><div><font color="#000000"><span style="background-color:rgba(255,255,255,0)">-DW</span></font></div></blockquote><span style="background-color:rgba(255,255,255,0)">&quot;</span></div><div><span style="background-color:rgba(255,255,255,0)"><br></span></div></span><div><span style="background-color:rgba(255,255,255,0)">What is the problem? Changing the relative precedence of external operators in your file? Doesn&#39;t the same &quot;problem&quot; occur in your proposal (only with one operator)?</span></div><div><span style="background-color:rgba(255,255,255,0)"><br></span></div><div><span style="background-color:rgba(255,255,255,0)">What is the difference between overriding an operator function like this:</span></div><div><span style="background-color:rgba(255,255,255,0)"><br></span></div><div><span style="background-color:rgba(255,255,255,0)">func + (l: Int, r: Int) -&gt; Int {</span></div><div><span style="background-color:rgba(255,255,255,0)">       return 0</span></div><div><span style="background-color:rgba(255,255,255,0)">}</span></div><div><span style="background-color:rgba(255,255,255,0)"><br></span></div><div><span style="background-color:rgba(255,255,255,0)">This can also mess up your code...</span></div></div><div>I&#39;m sorry if I haven&#39;t understood your point.</div><div><br></div><div>From the other email:</div><span class=""><div><br></div><div><div></div><blockquote type="cite"><div><span style="background-color:rgba(255,255,255,0)">I meant, are names `precedenceLessThan`, `precedenceEqualTo` a bit clunky? Maybe:</span></div><div><span style="background-color:rgba(255,255,255,0)"><br></span></div><div><span style="background-color:rgba(255,255,255,0)">associativity(left)</span></div><div><span style="background-color:rgba(255,255,255,0)">precedence(lessThan: +)</span></div><div><span style="background-color:rgba(255,255,255,0)">precedence(equalTo: +)</span></div><div><span style="background-color:rgba(255,255,255,0)"><br></span></div><div><span style="background-color:rgba(255,255,255,0)">It also solves my concern about dictionary inside braces.</span></div></blockquote><br></div></span><div>I prefer &quot;precedence(+ lessThan *)&quot;. However I don&#39;t think it&#39;s Swift style since &quot;lessThan&quot; is like an infix operator <b>with letters </b>although the symmetry between &quot;+&quot; and &quot;*&quot; would be nicely handled by such operator.</div><div><br></div><div><span class=""><blockquote type="cite"><span style="background-color:rgba(255,255,255,0)">Precedence groups have a great benefit of additional symmetry. Transitive precedence propagation, on the other hand, also has benefits:</span><div><span style="background-color:rgba(255,255,255,0)"><br></span><div><span style="background-color:rgba(255,255,255,0)">1. It does not introduce new entities, just some rules for compiler</span></div><div><span style="background-color:rgba(255,255,255,0)">2. It does not add new keywords. In your current wording, we have to take precedence and precedenceGroup as keywords, that&#39;s why I originally preferred directives</span></div></div></blockquote><div><br></div></span><div>Both 1 and 2 are true but I still prefer to use declarations since they provide exactly one location where to put operators with equal precedence.</div><div><br></div><div>By the way &quot;precedence&quot; is already a keyword... One more to go :)</div><span class=""><br><blockquote type="cite"><div><div><span style="background-color:rgba(255,255,255,0)">3. We actually think in terms of operators, not groups.</span></div><div><span style="background-color:rgba(255,255,255,0)">If I want to say that my operator should have the same priority as `+`, I&#39;d rather say that I want it to have priority of plus and minus, not &quot;belong to multiplicative group&quot;.</span></div><div><span style="background-color:rgba(255,255,255,0)">If I declare &lt;$&gt; and want it to have same priority as &lt;*&gt;, it would be more difficult to invent some name for their group like FunctorManipulator.</span></div><div><span style="background-color:rgba(255,255,255,0)"><br></span></div></div></blockquote><div><br></div></span><div>I think this deserves more discussion:</div><div>Should we allow &quot;precedence(... equalTo ...)&quot; for operators if we have precedence groups?</div><div><br></div><div>Such a precedence declaration would be contrary to my argument above: declare equal operator precedences in one place, which is more maintainable.</div><span class=""><br><blockquote type="cite"><div><div><span style="background-color:rgba(255,255,255,0)">On the other hand, in your solution you have a list of global rules and don&#39;t really need braces. How about this?</span></div></div><div><span style="background-color:rgba(255,255,255,0)"><br></span></div><span style="background-color:rgba(255,255,255,0)">#precedenceGroup(Additive)</span><div><span style="background-color:rgba(255,255,255,0)">#precedenceGroup(Multiplicative)</span></div><div><span style="background-color:rgba(255,255,255,0)">#precedence(Additive, less, Multiplicative)</span></div><span style="background-color:rgba(255,255,255,0)">#operator(+, infix, associativity: left, group: Additive)</span><div><span style="background-color:rgba(255,255,255,0)">#operator(*, infix, associativity: left, group: Multiplicative)</span></div><div><span style="background-color:rgba(255,255,255,0)">#operator(&lt;&gt;, infix)</span></div><div><span style="background-color:rgba(255,255,255,0)"><br></span></div><div><span style="background-color:rgba(255,255,255,0)">So precedence group is just a tag that can be used in precedence rules and assigned to operators at declaration.</span></div></blockquote><br></span></div><div>Although it is consistent with your proposal for me it is too much repetition and &quot;code noise&quot;. Compare:</div><span class=""><div><br></div><div>infix operator + { <span style="background-color:rgba(255,255,255,0)">associativity: left }</span></div></span><span class=""><div><span style="background-color:rgba(255,255,255,0)">infix operator * { associativity: left }</span></div></span><div><span style="background-color:rgba(255,255,255,0)">infix operator &lt;&gt; {}</span></div><div>precedenceGroup Additive { + }</div><div>precedenceGroup Multiplicative { * }</div><div>precedence(Additive lessThan Multiplicative)</div><div><br></div><div>Which is in my opinion way more readable even without syntax highlighting.</div><div><br></div><div><br></div><div>Thank You for sharing Your thoughts which have enriched me! :)</div><div><br></div><div>Best regards</div><span class="HOEnZb"><font color="#888888"><div>- Maximilian</div><blockquote type="cite"><div dir="ltr"><div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
</blockquote></div>
</div>
</blockquote></font></span></div></div></blockquote></div><br></div>