<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body dir="auto"><div></div><div>Inline</div><div><br></div><div>Am 04.04.2016 um 08:06 schrieb Антон Жилин &lt;<a href="mailto:antonyzhilin@gmail.com">antonyzhilin@gmail.com</a>&gt;:<br><br></div><blockquote type="cite"><div><div dir="ltr">Thank you for a helpful answer!<div>I like the idea of overriding precedence from another module. We won't need to introduce additional keywords or visibility for operators. I will add it to the proposal.<div><br></div><div>I assume you mean precedence inside braces of operator, then operator scope makes sense. Self operator could be omit as well, following the idea that we are introducing a new operator and want to compare it to others:</div><div><br></div><div>infix operator * {</div><div>&nbsp; &nbsp; associativity: left</div><div>&nbsp; &nbsp; precedenceLess: ^</div><div>&nbsp; &nbsp; precedenceEqual: /</div><div>&nbsp; &nbsp; precedenceGreater: +</div><div>}</div><div>infix operator / {</div><div>&nbsp; &nbsp; associativity: left</div><div>&nbsp; &nbsp; precedenceLess: ^</div><div>&nbsp; &nbsp; precedenceEqual: *</div><div>&nbsp; &nbsp; precedenceGreater: +</div><div>}</div><div><br></div><div>Equivalent precedence rules would be allowed for symmetry in the operator definitions.</div><div>We would still be able to reopen the scope and add precedence and associativity rules.</div><div>I agree that this scheme has advantage of being a smaller change.</div><div><br></div><div>I'm still concerned about syntax.</div><div>Is it OK to have "less, equal, greater" in precedence name?</div></div></div></div></blockquote><div><br></div><div>What do you mean by OK? Other operators like == are weird:</div><div><br></div><div>precedence(== == &lt;)</div><div>// in comparison to</div><div>precedence(== equalTo &lt;)</div><br><blockquote type="cite"><div><div dir="ltr"><div><div>Is it OK to have both curly brackets and dictionary syntax (a precedent, I guess)?</div></div></div></div></blockquote><div><br></div><div>That could be a consistency problem. However I'd like to keep a declaration syntax instead of defining operators through compiler directives.</div><br><blockquote type="cite"><div><div dir="ltr"><div><div>Is it OK to leave prefix and postfix operators always with empty braces?</div><div><br></div></div></div></div></blockquote><div><br></div><div>I'm fine with that.</div><br><blockquote type="cite"><div><div dir="ltr"><div><div>Would it be better to have multiple precedence comparisons at once:</div><div>precedenceGreater: +, -, *, /</div><div>Or one comparison per line will be more readable?</div><div><br></div><div>I will add this to alternatives, but will not swap it with currently stated syntax for now, waiting for some more response.</div><div><br></div><div>What do you think?</div><div><br></div><div>- Anton</div></div></div></div></blockquote><div><br></div><div>After thinking more about it I came to the conclusion that we should have something like "precedence groups" where all operators have the same precedence:</div><div><br></div><div>precedenceGroup Additive {</div><div>&nbsp; &nbsp; +, -</div><div>}</div><div><br></div><div><span style="background-color: rgba(255, 255, 255, 0);">precedenceGroup</span> Multiplicative {</div><div>&nbsp; &nbsp; *, /</div><div>}</div><div><br></div><div>// first we could allow an operator to be only</div><div>// in one p.Group. Later when we can infer</div><div>// precedences we can allow operators to be</div><div>// in more than one p.Group (if that is even necessary)</div><div><br></div><div><br></div><div>// precedence declaration</div><div>precedence(Additive lessThan Multiplicative)</div><div><br></div><div>// precedence declarations take</div><div>// "<span style="background-color: rgba(255, 255, 255, 0);">precedenceGroup"s and "operator"s.</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);"><br></span></div><div><span style="background-color: rgba(255, 255, 255, 0);">// It could also work with extensions so you</span></div><div><span style="background-color: rgba(255, 255, 255, 0);">// can easily insert it in the precedence hierarchy:</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);">infix operator +- {</span></div><div><span style="background-color: rgba(255, 255, 255, 0);">&nbsp; &nbsp; associativity: left</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);">// more operator declarations ...</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);">extension Additive {</span></div><div><span style="background-color: rgba(255, 255, 255, 0);">&nbsp; &nbsp; +-, -+, ++, --</span></div><div><span style="background-color: rgba(255, 255, 255, 0);">}</span></div><div><br></div><div>// the syntax I used is highly discussable.</div><div>// this should mainly be a concept suggestion.</div><div>// I think it allows for greater flexibility since you can define</div><div>// operator precedences much easier.</div><div><br></div><div>With kind regards</div><div>- Maximilian</div><blockquote type="cite"><div><div dir="ltr"><div><div><div class="gmail_extra"><br><div class="gmail_quote">2016-04-04 8:06 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:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="auto"><div></div><div>See inline</div><span class=""><div><br>Am 03.04.2016 um 13:26 schrieb Ross O'Brien via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt;:<br><br></div><blockquote type="cite"><div><div dir="ltr">There is a problem here of duplicated operators or custom precedence, and how that gets passed between modules.<div>Assume there are three modules, A, B and C. B defines a custom operator **. A and C each define a custom operator ++, and their meanings are different (though, even if their meanings were the same, I'm not sure if they could unify).</div><div><br></div><div>Module D uses A and B as dependencies and sets a custom precedence on ++ and **. Module E uses B and C and has a different precedence on ++ and **. You're working on Module F which uses D and E. Which ++ and which precedence does F get implicitly?</div><div><br></div></div></div></blockquote><div><br></div></span><div>We could allow operator precedence overriding to resolve ambiguity. However this overriding should only be module internal since it would override the existing precedences in the other modules.</div><div><br></div><div>@AHTOH</div><div>Why do you use #keyword ?</div><div>I think defining a operator with</div><div><br></div><div>&nbsp; &nbsp; infix operator + {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;associativity: left</div><div>&nbsp; &nbsp; }</div><div><br></div><div>is perfectly fine since it is similar to class/struct/enum declaration.</div><div><br></div><div>&nbsp; &nbsp; // and it's precedence</div><div>&nbsp; &nbsp; precedence(+ lessThan *)</div><div><br></div><div>Note the missing "," and ":" before and after "lessThan" in order to give both operators the same importance&nbsp;<span style="background-color:rgba(255,255,255,0)">(minor issue).</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)">I feel that</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)">&nbsp; &nbsp; #precedence(+, lessThan: *)</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)">puts too much importance on the first 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)">Best regards</span></div><span class=""><font color="#888888"><div><span style="background-color:rgba(255,255,255,0)">- Maximilian</span></div></font></span><div><div class="h5"><blockquote type="cite"><div><span>_______________________________________________</span><br><span>swift-evolution mailing list</span><br><span><a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a></span><br><span><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a></span><br></div></blockquote></div></div></div></blockquote></div><br></div></div></div></div>
</div></blockquote></body></html>