<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><div><blockquote type="cite" class=""><div class="">On Oct 9, 2017, at 11:02 PM, Xiaodi Wu via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">This idea was discussed long ago and the present design was selected.</span></div></blockquote><br class=""></div><div>But this design was discussed in the proposal as a "future direction", because @discardableResult was chosen partially because it was easier to implement. It says so [in the proposal][1]. This is why we write formal proposals, Xiaodi—so we remember why we made the decisions we made.</div><div><br class=""></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>* * *</div><div><br class=""></div><div>Now, the proposal specifically suggests we delay `@discardable` "until such time as there's a strong motivation to use such an approach". Do we have such a motivation?</div><div><br class=""></div><div>I actually think we do (although it may not be strong enough). Currently, we have two types—`Void` (as well as optionals, of any depth, wrapping `Void`) and `Never`—which are "implicitly discardable". That is, you don't need to mark a function which returns those types with `@discardableResult`; it inherently is. This is currently handled with [an ad-hoc test][2], but I think we should consider strengthening and opening up this mechanism.</div><div><br class=""></div><div>Why? Because there are other types we would like to be implicitly discardable. You can already make an argument for types like `Array&lt;Void&gt;`, but concurrency will bring types like `Future&lt;Void&gt;` which could get pretty strong benefits from it. Since we're planning to leave a lot of async stuff to userspace, there ought to be a userspace way to mark types as implicitly discardable. And if discardability stems from the type system, it's pretty natural to make ad-hoc discardibility a property attached to the type, too.</div><div><br class=""></div><div>(We could then mark `Never` with @discardable, make tuples discardable unless one of their elements is not discardable, make optionals discardable if the type they wrap is discardable, and—et voilà!—we have a nice, general language feature with as little magic as we can manage.)</div><div><br class=""></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>[1]: <a href="https://github.com/apple/swift-evolution/blob/master/proposals/0047-nonvoid-warn.md#future-directions" class="">https://github.com/apple/swift-evolution/blob/master/proposals/0047-nonvoid-warn.md#future-directions</a></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>[2]:&nbsp;<a href="https://github.com/apple/swift/blob/e907031d3d4555e917ca3ad7fffeac7f580331a0/lib/Sema/TypeCheckStmt.cpp#L991" class="">https://github.com/apple/swift/blob/e907031d3d4555e917ca3ad7fffeac7f580331a0/lib/Sema/TypeCheckStmt.cpp#L991</a></div><div><br class=""></div><div class="">
<span class="Apple-style-span" style="border-collapse: separate; font-variant-ligatures: normal; font-variant-east-asian: normal; font-variant-position: normal; line-height: normal; border-spacing: 0px;"><div class=""><div style="font-size: 12px; " class="">--&nbsp;</div><div style="font-size: 12px; " class="">Brent Royal-Gordon</div><div style="font-size: 12px; " class="">Architechies</div></div></span>

</div>
<br class=""></body></html>