<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body><div>If it's defined as type Any, then we'd also need a guaranteed compiler optimization (preferably one that happens in debug builds too) that omits the creation of the `Any` value if it's unused.<br></div>
<div>&nbsp;</div>
<div>-Kevin</div>
<div>&nbsp;</div>
<div>On Sat, Dec 5, 2015, at 08:46 PM, Jacob Bandes-Storch wrote:<br></div>
<blockquote type="cite"><div dir="ltr"><div>That approach seems fine to me; I don't think it seems like magic.<br></div>
<div>&nbsp;</div>
<div>"<span class="font" style="font-family:monospace, ' monospace'">if x { returnsAnInt() } else { returnsAString() }</span>" &nbsp;would have type Any, but would only emit a warning if you actually tried to <b>use</b> the value. Much like the current warning, "<i>X inferred to have type Any, which may be unexpected</i>".<br></div>
<div><div>&nbsp;</div>
<div><div><div dir="ltr"><div>Jacob Bandes-Storch<br></div>
</div>
</div>
</div>
<div>&nbsp;</div>
<div><div>On Sat, Dec 5, 2015 at 7:53 PM, Kevin Ballard via swift-evolution <span dir="ltr">&lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt;</span> wrote:<br></div>
<blockquote style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0.8ex;border-left-width:1px;border-left-color:rgb(204, 204, 204);border-left-style:solid;padding-left:1ex;"><div><u></u><br></div>
<div><div>&nbsp;</div>
<div><span>On Sat, Dec 5, 2015, at 04:32 PM, Lukas Stabe via swift-evolution wrote:</span><br></div>
<blockquote type="cite"><div>&nbsp;</div>
<div><blockquote type="cite"><div><span>I don't think you can just get rid of the if statement in favor of an expression. You still want to be able to do this:</span><br></div>
<div><div dir="ltr"><div>&nbsp;</div>
<div><span>if (condition) {</span><br></div>
<div><span>&nbsp; &nbsp; funcWithSideEffectsThatReturnsInt()</span><br></div>
<div><span>} else {</span><br></div>
<div><span>&nbsp; &nbsp; funcWithSideEffectsThatReturnsString()</span><br></div>
<div><span>}</span><br></div>
<div>&nbsp;</div>
<div><span>but that's not a valid expression (what is its type?).</span><br></div>
</div>
</div>
</blockquote><div>&nbsp;</div>
<div><span>An if statement with two different types could just have the closes common ancestor or Any as type.</span><br></div>
</div>
</blockquote><div>&nbsp;</div>
<div>&nbsp;</div>
<div>That's a great way to cause confusion.<br></div>
<div>&nbsp;</div>
<div>Rust has this feature (all statements are expressions), and it requires if statements to have an else branch with the same type unless the type is `()`. It's solution to the issue of the branches returning unwanted values is that Rust uses semicolons, and the semicolon acts sort of like an operator that consumes any value and returns `()`, so if you terminate the last statement of the branch with a semicolon, the whole branch returns `()`, and if you leave it off, the branch returns a value. It's actually very elegant and straightforward.<br></div>
<div>&nbsp;</div>
<div>That said, proposing that Swift introduce this same rule for semicolons is probably not a good idea. We certainly could declare that an explicit semicolon has this behavior, so you'd see people writing code like<br></div>
<div>&nbsp;</div>
<div><span class="font" style="font-family:menlo, consolas, 'courier new', monospace, sans-serif">if condition {</span><br></div>
<div><span class="font" style="font-family:menlo, consolas, 'courier new', monospace, sans-serif">&nbsp; &nbsp; funcWithSideEffectsThatReturnsInt();</span><br></div>
<div><span class="font" style="font-family:menlo, consolas, 'courier new', monospace, sans-serif">}</span><br></div>
<div>&nbsp;</div>
<div>but it would be confusing because semicolons are almost never used in Swift.<br></div>
<div>&nbsp;</div>
<div>An alternative that would work today is just relying on assignment returning Void, so you can write<br></div>
<div>&nbsp;</div>
<div><span class="font" style="font-family:menlo, consolas, 'courier new', monospace, sans-serif">if condition {</span><br></div>
<div><span class="font" style="font-family:menlo, consolas, 'courier new', monospace, sans-serif">&nbsp; &nbsp; _ = funcWithSideEffectsThatReturnsInt()</span><br></div>
<div><span class="font" style="font-family:menlo, consolas, 'courier new', monospace, sans-serif">}</span><br></div>
<div>&nbsp;</div>
<div>but that looks kind of weird and would probably also be confusing. Better than the semicolon rule I think, but still not great.<br></div>
<div>&nbsp;</div>
<div>Another option is to check if the return value is actually used anywhere, and if it's not, then silently coerce it to Void. This way you can write<br></div>
<div>&nbsp;</div>
<div><span class="font" style="font-family:menlo, consolas, 'courier new', monospace, sans-serif">if condition {</span><br></div>
<div><span class="font" style="font-family:menlo, consolas, 'courier new', monospace, sans-serif">&nbsp; &nbsp; funcWithSideEffectsThatReturnsInt()</span><br></div>
<div><span class="font" style="font-family:menlo, consolas, 'courier new', monospace, sans-serif">} else {</span><br></div>
<div><span class="font" style="font-family:menlo, consolas, 'courier new', monospace, sans-serif">&nbsp; &nbsp; funcWithSideEffectsThatReturnsString()</span><br></div>
<div><span class="font" style="font-family:menlo, consolas, 'courier new', monospace, sans-serif">}</span><br></div>
<div>&nbsp;</div>
<div>and it would be fine but writing<br></div>
<div>&nbsp;</div>
<div><span class="font" style="font-family:menlo, consolas, 'courier new', monospace, sans-serif">let foo = if condition {</span><span class="font" style="font-family:menlo, consolas, 'courier new', monospace, sans-serif"></span><br></div>
<div><span class="font" style="font-family:menlo, consolas, 'courier new', monospace, sans-serif">&nbsp; &nbsp; funcWithSideEffectsThatReturnsInt()</span><span class="font" style="font-family:menlo, consolas, 'courier new', monospace, sans-serif"></span><br></div>
<div><span class="font" style="font-family:menlo, consolas, 'courier new', monospace, sans-serif">} else {</span><span class="font" style="font-family:menlo, consolas, 'courier new', monospace, sans-serif"></span><br></div>
<div><span class="font" style="font-family:menlo, consolas, 'courier new', monospace, sans-serif">&nbsp; &nbsp;&nbsp;funcWithSideEffectsThatReturnsString()</span><span class="font" style="font-family:menlo, consolas, 'courier new', monospace, sans-serif"></span><br></div>
<div><span class="font" style="font-family:menlo, consolas, 'courier new', monospace, sans-serif">}</span><br></div>
<div>&nbsp;</div>
<div>would fail with a type error.<br></div>
<div>&nbsp;</div>
<div>I suspect that this is the right approach, but it does involve a bit of magic.<br></div>
<div>&nbsp;</div>
<div>-Kevin<br></div>
<div><img style="min-height:1px !important;width:1px !important;border-top-width:0px !important;border-right-width:0px !important;border-bottom-width:0px !important;border-left-width:0px !important;margin-top:0px !important;margin-bottom:0px !important;margin-right:0px !important;margin-left:0px !important;padding-top:0px !important;padding-bottom:0px !important;padding-right:0px !important;padding-left:0px !important;" border="0" height="1" width="1" alt="" src="https://www.fastmailusercontent.com/proxy/1f4529fd7352c93517a5b493dc533e00eeb6391bd06c4429eaa3ebd2c24f5582/8647470737a3f2f25723030323431303e23647e23756e64676279646e2e65647f27766f2f60756e6f35707e6d305d2232437952624a584252457c44424a416c4434494b444e466b6b6a60725f4f67745972514f4266513131777958745b676873566631713d60333d22324668756d60703473645f67454249367237555744413939755d2236464276307d2236497d40726f49516875596d4d22364d22324d2232456e607d22364743417463317863503f4d2236463e61305e493863546179754b65643059636c647b425752496a443565735f6351553a72496f444644375a6d644337617b4d4d22324a51497535396279525a77517a537d417d2232476e6371433a5946653673416351786a47317a674d223646377a7c48746f61635552783156377979616455715965763169574a754d23344/open"><br></div>
</div>
<div>&nbsp;</div>
<div>_______________________________________________<br></div>
<div>
swift-evolution mailing list<br></div>
<div> <a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br></div>
<div> <a href="https://lists.swift.org/mailman/listinfo/swift-evolution">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br></div>
<div>&nbsp;</div>
</blockquote></div>
</div>
</div>
</blockquote><div>&nbsp;</div>
</body>
</html>