<div dir="ltr"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Remember too that in Swift the <i>operator</i> is decoupled from its <i>implementation.</i> Plenty of people are using &amp;&amp; for things like constraint or predicate DSLs, where it doesn&#39;t short-circuit.</blockquote><div><br></div><div>I think I&#39;m convinced. :-)</div><div>If you want to use &amp;&amp; or || as an accumulator, left-associativity makes more sense.</div><div><br></div><div>```</div><div><span style="font-family:monospace,monospace">func || (condition: Condition, val: String) -&gt; Condition {</span><br></div><div><font face="monospace, monospace">  return </font><span style="font-family:monospace,monospace">condition</span><font face="monospace, monospace">.addingOr(string: val)</font><br></div><div><font face="monospace, monospace">}</font></div><div><font face="monospace, monospace">condition = condition || &quot;&gt;= 42&quot; || &quot;&lt; 12&quot;</font></div><div>```</div><div><br></div><div>Thank you guys!</div><div class="gmail_extra"><br><div class="gmail_quote">2017-02-21 3:16 GMT+09:00 Jordan Rose <span dir="ltr">&lt;<a href="mailto:jordan_rose@apple.com" target="_blank">jordan_rose@apple.com</a>&gt;</span>:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div style="word-wrap:break-word"><div>Remember too that in Swift the <i>operator</i> is decoupled from its <i>implementation.</i> Plenty of people are using &amp;&amp; for things like constraint or predicate DSLs, where it doesn&#39;t short-circuit. Of course, a non-associative version of &amp;&amp; would be quite surprising, so even a custom implementation probably shouldn&#39;t rely on the left-associativity.</div><div><br></div><div>There&#39;s one other reason to prefer this way, though, and that&#39;s complexity in the AST. Recall that the RHS of the standard &amp;&amp; (and ||, and ??) is an auto-closure—Swift&#39;s way to avoid the eager evaluation of the argument. Right-associativity would result in heavily-nested autoclosures, and even though they&#39;ll all be flattened as part of compilation, the AST representation still has to model them that way. So purely from a compiler-implementation perspective left-associativity has a small edge.</div><div><br></div><div>I think you&#39;re right that we should have picked right-associativity anyway, but at this point I&#39;m not sure it&#39;s worth changing it.</div><span class="gmail-HOEnZb"><font color="#888888"><div><br></div><div>Jordan</div></font></span><div><div class="gmail-h5"><div><br></div><br><div><blockquote type="cite"><div>On Feb 17, 2017, at 01:03, Saagar Jha via swift-users &lt;<a href="mailto:swift-users@swift.org" target="_blank">swift-users@swift.org</a>&gt; wrote:</div><br class="gmail-m_3600299061837185870Apple-interchange-newline"><div><div style="word-wrap:break-word">Left associativity is most likely just a holdover from the C family–not conforming with it would break expectations for programmers coming from these languages. And as you mentioned, the compiler will short-circuit the condition and stop evaluating as soon as it encounters a false condition, so there’s no measurable benefit.<div><br><div>
<div style="letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;word-wrap:break-word">Saagar Jha</div>

</div>
<br><div><blockquote type="cite"><div>On Feb 17, 2017, at 12:54 AM, rintaro ishizaki via swift-users &lt;<a href="mailto:swift-users@swift.org" target="_blank">swift-users@swift.org</a>&gt; wrote:</div><br class="gmail-m_3600299061837185870Apple-interchange-newline"><div><div dir="ltr"><div>Hello all,</div><div><br></div><div>Why the associativity of <font face="monospace, monospace">Logical{Conjunction,<wbr>Disjunction}Precedence</font> is &quot;<font face="monospace, monospace">left</font>&quot;?<br></div><div><br></div><div>If you write: <font face="monospace, monospace">A &amp;&amp; B &amp;&amp; C</font>, it&#39;s grouped as <font face="monospace, monospace">(A &amp;&amp; B) &amp;&amp; C</font>.</div><div>This means that the<font face="monospace, monospace"> &amp;&amp;</font> function is <i>always</i> called twice: <font face="monospace, monospace">(&amp;&amp;)((&amp;&amp;)(A, B), C)</font>.</div><div>I feel &quot;right&quot; associativity is more natural:  <span style="font-family:monospace,monospace">(&amp;&amp;)(A</span><span style="font-family:monospace,monospace">, (&amp;&amp;)(B, C))</span><font face="arial, helvetica, sans-serif">,</font><br></div><div><font face="arial, helvetica, sans-serif">because the </font><font face="monospace, monospace">&amp;&amp;</font><font face="arial, helvetica, sans-serif"> function is called only once if </font><font face="monospace, monospace">A</font><font face="arial, helvetica, sans-serif"> is </font><font face="monospace, monospace">false</font><font face="arial, helvetica, sans-serif">.</font></div><div><br></div><div><span style="font-family:arial,helvetica,sans-serif">I know that redundant &amp;&amp; calls are optimized away in most cases.</span><br></div><div><div><font face="arial, helvetica, sans-serif">I also know C and C++ standard says: &quot;The &amp;&amp; operator groups left-to-right&quot;, and most programming languages follow that.</font></div></div><div><br></div><div><font face="arial, helvetica, sans-serif">But why not &quot;</font><font face="monospace, monospace">right</font><font face="arial, helvetica, sans-serif">&quot; </font>associativity<span style="font-family:arial,helvetica,sans-serif">?</span></div><div><span style="font-family:arial,helvetica,sans-serif">What is the difference between logical operators and </span><font face="monospace, monospace">??</font><font face="arial, helvetica, sans-serif"> operator that has &quot;</font><font face="monospace, monospace">right</font><font face="arial, helvetica, sans-serif">&quot; associativity?</font></div><div><br></div></div>
______________________________<wbr>_________________<br>swift-users mailing list<br><a href="mailto:swift-users@swift.org" target="_blank">swift-users@swift.org</a><br><a href="https://lists.swift.org/mailman/listinfo/swift-users" target="_blank">https://lists.swift.org/<wbr>mailman/listinfo/swift-users</a><br></div></blockquote></div><br></div></div>______________________________<wbr>_________________<br>swift-users mailing list<br><a href="mailto:swift-users@swift.org" target="_blank">swift-users@swift.org</a><br><a href="https://lists.swift.org/mailman/listinfo/swift-users" target="_blank">https://lists.swift.org/<wbr>mailman/listinfo/swift-users</a><br></div></blockquote></div><br></div></div></div></blockquote></div><br></div></div>