This proposal would be even better with the @autoescape(once) proposal 
(https://github.com/zneak/swift-evolution/blob/master/proposals/00xx-noescape-once.md)

We could extract `let` values from the block:

        let a: Int
        let b: String
        autoreleasepool {
                a = …
                b = ...
        }
        // use a and b

Gwendal Roué

> Le 22 mars 2016 à 06:34, Timothy Wood via swift-evolution 
> <[email protected]> a écrit :
> 
> 
> I think I’ve captured the feedback and conversation so far. Please let me 
> know if I’ve missed anything or if there are further concerns or ideas for 
> improvement.
> 
> Thanks!
> 
> -tim
> 
> 
> <https://github.com/tjw/swift-evolution/blob/SR-842/proposals/NNNN-autoreleasepool-signature.md
>  
> <https://github.com/tjw/swift-evolution/blob/SR-842/proposals/NNNN-autoreleasepool-signature.md>>
> 
> Add Generic Result and Error Handling to autoreleasepool()
> Proposal: SE-NNNN 
> <https://github.com/apple/swift-evolution/blob/master/proposals/NNNN-autoreleasepool-signature.md>
> Author(s): Timothy J. Wood <https://github.com/tjw>
> Status: Awaiting review
> Review manager: TBD
>  <https://github.com/tjw/swift-evolution/tree/SR-842#introduction>Introduction
> 
> The autoreleasepool function in the standard library does not currently 
> support a return value or error handling, making it difficult and error-prone 
> to pass results or errors from the body to the calling context.
> 
> Swift-evolution thread: A first call for discussion was made here 
> <https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20160314/013054.html>.
>  Dmitri Gribenko pointed out that adding a generic return type would be 
> useful (first in my premature pull request) and then also here 
> <https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20160321/013059.html>.
>  Jordan Rose pointed out 
> <https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20160321/013077.html>
>  that care was needed to avoid inferring an incorrect return type for the 
> body block, but after testing we confirmed that this is handled correctly by 
> the compiler.
> 
>  <https://github.com/tjw/swift-evolution/tree/SR-842#motivation>Motivation
> 
> The current signature for autoreleasepool forces the creation of temporary 
> variables to capture any results of the inner computation, as well as any 
> error to eventually throw, in the case they are needed in the calling code. 
> This extra boilerplate clutters up the intent, as well as introduces the risk 
> of accidentally unwrapping a nil value.
> 
> For example:
> 
> func doWork() throws -> Result {
>     var result: Result? = nil
>     var error: ErrorProtocol? = nil
>     autoreleasepool {
>         do {
>             ... actual computation which hopefully assigns to result but 
> might not ...
>         } catch let e {
>             error = e
>         }
>     }
>     guard let result = result else {
>         throw error!
>     }
>     return result!
> }
>  
> <https://github.com/tjw/swift-evolution/tree/SR-842#proposed-solution>Proposed
>  solution
> 
> I'd like to propose altering the signature of the standard library 
> autoreleasepool function to allow for a generic return type, as well as 
> allowing a throw of an error:
> 
> public func autoreleasepool<Result>(@noescape body: () throws -> Result) 
> rethrows -> Result
> The case above becomes much more clear and less error-prone since the 
> compiler can enforce that exactly one of the error and result are used:
> 
> func doWork() throws -> Result {
>     return try autoreleasepool {
>         ... actual computation which either returns or throws ...
>     }
> }
> As an aside, since this proposes changing the signature already, I would like 
> to further propose changing the argument label from code to body. This seems 
> more in line with the parameter name used in the rest of the standard 
> library, but isn't central to this proposal.
> 
>  <https://github.com/tjw/swift-evolution/tree/SR-842#detailed-design>Detailed 
> design
> 
> The updated standard library function would read:
> 
> public func autoreleasepool<Result>(@noescape body: () throws -> Result) 
> rethrows -> Result {
>     let pool = __pushAutoreleasePool()
>     defer {
>         __popAutoreleasePool(pool)
>     }
>     return try body()
> }
>  
> <https://github.com/tjw/swift-evolution/tree/SR-842#impact-on-existing-code>Impact
>  on existing code
> 
> No impact expected.
> 
>  
> <https://github.com/tjw/swift-evolution/tree/SR-842#alternatives-considered>Alternatives
>  considered
> 
> The original request, SR-842 <https://bugs.swift.org/browse/SR-842> only 
> suggested adding throws, but Dmitri Gribenko pointed out that adding a 
> generic return type would be better.
> 
> I also explored whether third-party code could wrap autoreleasepool 
> themselves with something like:
> 
> func autoreleasepool_generic<ResultType>(@noescape code: Void throws -> 
> ResultType) rethrows -> ResultType {
>     var result:ResultType?
>     var error:ErrorProtocol?
> 
>     autoreleasepool {
>         do {
>             result = try code()
>         } catch let e {
>             error = e
>         }
>     }
> 
>     if let result = result {
>         return result
>     }
> 
>     throw error! // Doesn't compile.
> }
> but this doesn't compile, since in a function with rethrows, only the call to 
> the passed in function that is marked as throws is allowed to throw. Even if 
> it was possible to create a rethrows wrapper from the non-throwing function, 
> it is better to add the safety to the standard library in the first place.
> _______________________________________________
> 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