<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body><div>If we need some way to say "this local variable should extend to the end of the scope", the most obvious (to me) way to do that is to introduce an attribute that you can add to the variable declaration. This would be similar to Obj-C's __attribute__((objc_precise_lifetime)), although not quite as wordy. Although I am tempted to say we should go with `defer { _ = val }` because I always like when you can re-use existing language features; that does require we define `_ = val` as extending the lifetime of val to that point, but as I said before I think that's a perfectly reasonable thing to do.<br></div>
<div>&nbsp;</div>
<div>-Kevin Ballard<br></div>
<div>&nbsp;</div>
<div>On Wed, Dec 30, 2015, at 03:23 PM, Matthew Johnson wrote:<br></div>
<blockquote type="cite"><div>&nbsp;</div>
<div><blockquote type="cite"><div>On Dec 30, 2015, at 5:19 PM, Kevin Ballard via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br></div>
<div>&nbsp;</div>
<div><div><div>On Wed, Dec 30, 2015, at 03:12 PM, Kevin Wooten via swift-evolution wrote:<br></div>
<blockquote type="cite"><div><blockquote type="cite"><div><blockquote type="cite" style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;orphans:auto;text-align:start;text-indent:0px;text-transform:none;white-space:normal;widows:auto;word-spacing:0px;-webkit-text-stroke-width:0px;"><div><div>&nbsp;</div>
<div>Another possibility I've thought of is defining `defer { val }` to guarantee that val remains alive until the defer fires on scope exit. That might let us leave `defer` as the one "guarantee something happens exactly at scope exit" language construct.<br></div>
</div>
</blockquote></div>
</blockquote><div>&nbsp;</div>
<div>What about this…<br></div>
<div>&nbsp;</div>
<div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:13px;line-height:normal;font-family:Menlo;"><span class="colour" style="color:rgb(187, 44, 162)">defer</span> <span class="colour" style="color:rgb(187, 44, 162)">let</span>&nbsp;val = grabOrCreateSomething() {<br></div>
<div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:13px;line-height:normal;font-family:Menlo;">&nbsp; return;<br></div>
<div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:13px;line-height:normal;font-family:Menlo;min-height:15px;">}<br></div>
<div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:13px;line-height:normal;font-family:Menlo;">&nbsp;</div>
<div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;line-height:normal;">Seems natural once you learn guard.<br></div>
</div>
</div>
</blockquote><div>&nbsp;</div>
<div>Natural? I have no idea what you're expecting that expression to actually do. What is a "defer let”?<br></div>
</div>
</div>
</blockquote><div>&nbsp;</div>
<div>I think the idea is that a local variable declared with a `defer` modifier has its lifetime extended until the scope exits. &nbsp;It is a slightly more compact version of what Joe suggested. &nbsp;But I agree that it has potential for confusion - it reads like it is deferring the initialization of `val` until the scope exits which would be rather pointless.<br></div>
<div>&nbsp;</div>
<div>I do like the idea of making the extended lifetime part of the local variable declaration but I’m not sure about how this specific syntax reads.<br></div>
<div>&nbsp;</div>
<blockquote type="cite"><div><div><div>&nbsp;</div>
<div>-Kevin<br></div>
<div>&nbsp;</div>
<div><img style="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/f24ce16bcedcaf3b11c3275d39f95c11e95d9044440c97c2f1c83b2a812a3637/8647470737a3f2f25723030323431303e23647e23756e64676279646e2e65647f27766f2f60756e6f35707e6d356c464d427b4444583962487a5d2236426e6b6d22324a51767353686e4e4d2236467958546365614034573658777b6145693d456d2232433d22364371565a425d2232465a666f64533853426677656a74557648337349555a4239585442394464477a7b4d2232434f46473b6c686847345d22324f475451375d22324a78476966405243327e4a6e6d2236437241615771666a50785a6d223246777d66515a75684e49375348596a684932555a75573f4b4958364a4373784764446a70326c613665343d22364a5972665e443b433e43656675573b41795070585333653959767437433d6738635d4365365a4d6657734e4a5a425d6e696462736a6d445861653669795d23344/open"><br></div>
</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>https://lists.swift.org/mailman/listinfo/swift-evolution<br></div>
</div>
</blockquote></div>
</blockquote><div>&nbsp;</div>
</body>
</html>