Erica,

Maybe my phrasing was a bit off, but in my proposal it’s really important that 
the return and the defer are in the same scope. In your example the allocate 
memory line is in a different scope that the guard/else statements. Therefor, 
the defer { release memory } shouldn’t be executed if the guards don’t hold.

D

> On 06 Jun 2016, at 22:09, Erica Sadun <[email protected]> wrote:
> 
> This is problematic. You may want to defer code at different points with 
> different reasons. For example, you might not want to trigger defer until 
> after some preconditions have been met.:
> 
> guard something 
> guard something
> allocate memory; defer {release memory}
> 
> -- E
> 
> 
> 
>> On Jun 6, 2016, at 1:50 PM, donny wals via swift-evolution 
>> <[email protected]> wrote:
>> 
>> Hi,
>> 
>> When we’re using defer we write some code that we want to execute the moment 
>> a scope exits.
>> This leads to code that could read like:
>> 
>> let fibonacci = sequence(state: (0, 1)) { (pair: inout (Int, Int)) -> Int in
>>   defer { pair = (pair.1, pair.0 + pair.1) }
>>   return pair.0
>> }
>> 
>> What I find strange about this is that we have to write the code that we 
>> want to execute after the return before the return.
>> 
>> I’d like to propose a change to defer that would allow the above code to be 
>> written as:
>> 
>> let fibonacci = sequence(state: (0, 1)) { (pair: inout (Int, Int)) -> Int in
>>   return pair.0
>>   defer { pair = (pair.1, pair.0 + pair.1) }
>> }
>> 
>> This would make the intent of the code more clear (return first, then mutate 
>> state). Not all cases can benefit from this change, but anytime you exit a 
>> scope using a return I think it might be more clear to define the defer 
>> after the return. The code would more closely mirror the intent of the code.
>> 
>> A rule of thumb I’ve come up with for this is that whenever you’re using 
>> return to exit a scope, any defer in that same scope should be executed 
>> regardless of it’s position in that same scope. This proposal would 
>> supplement the way defer currently works.
>> 
>> What do you all think?
>> _______________________________________________
>> swift-evolution mailing list
>> [email protected]
>> https://lists.swift.org/mailman/listinfo/swift-evolution
> 

_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to