Hello Andrew,

I'm rather embarrassed: the initial design of this proposal was based on a 
modifier of @noescape:

        func f(@noescape(once) closure: () -> ()) { … }

But since the 0049 proposal has been accepted 
(https://github.com/apple/swift-evolution/blob/master/proposals/0049-noescape-autoclosure-type-attrs.md),
 @noescape is no longer an argument qualifier, but a type attribute.

The `once` discussed here can not be part of the type: if noescape can 
understandably be part of the type, the fact that a function guarantees it will 
call a closure once is a quality of that function, not of the closure.

So the proposed @noescape(once) syntax is now confusing as it would mix a type 
attribute and a argument qualifier.

I don't quite know how to escape this:

        // two @ signs
        func f(@noescape @once closure: () -> ()) { … }

        // Implies @noescape
        func f(@once closure: () -> ()) { … }

I'd like advice from competent people before I would attempt a rewrite of the 
proposal.

Gwendal Roué

> Le 10 avr. 2016 à 23:26, Andrew Bennett <[email protected]> a écrit :
> 
> Sorry I missed that scrolling back through the history, that proposal looks 
> great. It doesn't look like it has been submitted as a pull request to 
> swift-evolution yet though.
> 
> On Sunday, 10 April 2016, Gwendal Roué <[email protected] 
> <mailto:[email protected]>> wrote:
> Felix Cloutier already wrote one: 
> https://github.com/zneak/swift-evolution/blob/master/proposals/00xx-noescape-once.md
>  
> <https://github.com/zneak/swift-evolution/blob/master/proposals/00xx-noescape-once.md>
> 
> Do you think it needs to be rewritten?
> 
> Gwendal Roué
> 
>> Le 10 avr. 2016 à 14:56, Andrew Bennett <[email protected] 
>> <javascript:_e(%7B%7D,'cvml','[email protected]');>> a écrit :
>> 
>> Hi, not beyond this thread that I have seen. I think it's worth you 
>> summarizing this thread in a formal proposal and putting it up for 
>> discussion or submitting it as a PR :)
>> 
>> On Sunday, 10 April 2016, Gwendal Roué <[email protected] 
>> <javascript:_e(%7B%7D,'cvml','[email protected]');>> wrote:
>> Hello all,
>> 
>> I was wondering if this topic had evolved in anyway since its original 
>> introduction.
>> 
>> @noescape(once) would still be a useful addition to the language!
>> 
>> Gwendal Roué
>> 
>> 
>> 
>>> Le 3 févr. 2016 à 22:21, Félix Cloutier via swift-evolution 
>>> <[email protected] <>> a écrit :
>>> 
>>> I updated the proposal to address some concerns. It can be found at: 
>>> https://github.com/zneak/swift-evolution/blob/master/proposals/00xx-noescape-once.md
>>>  
>>> <https://github.com/zneak/swift-evolution/blob/master/proposals/00xx-noescape-once.md>
>>> 
>>> Things that changed:
>>> 
>>> It now says that the closure must be called on code paths where the 
>>> function throws;
>>> you can have multiple @noescape(once) parameters but they can't make 
>>> assumptions from one another.
>>> 
>>> I'm not 100% convinced that forcing a call on code paths that throw is 
>>> always desirable. I've changed it because Chris's support probably means 
>>> that the feature has better chances of making it, but I'm not convinced 
>>> yet. If throwing allows me to return without calling the closure, I can 
>>> write this:
>>> 
>>> do {
>>>     let foo: Int
>>>     try withLock(someLock, timeout: 0.5) {
>>>             foo = sharedThing.foo
>>>     }
>>> } catch {
>>>     print("couldn't acquire lock fast enough")
>>> }
>>> 
>>> which would be kind of messy if instead, the closure needed a parameter to 
>>> tell whether the lock was acquired or not when it runs.
>>> 
>>> Félix
>>> 
>>> _______________________________________________
>>> swift-evolution mailing list
>>> [email protected] <>
>>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>>> <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