> On Apr 23, 2016, at 3:18 AM, Gwendal Roué via swift-evolution 
> <[email protected]> wrote:
> 
> 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
>  
> <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.

Hi Gwendal,

I don’t think that the movement of @noescape affects the approach: I’d suggest 
that a proposal (e.g. Felix’s) go with:

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

The semantics are clear: the closure is guaranteed to be called exactly once on 
all normal and “throw” paths.  Paths that do not return in either of those ways 
(e.g. a call to abort) do not need to call the closure.

IMO, this is a small scope proposal that is likely to be accepted.

-Chris



> Gwendal Roué
> 
>> Le 10 avr. 2016 à 23:26, Andrew Bennett <[email protected] 
>> <mailto:[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

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

Reply via email to