[swift-evolution] [Review] SE-0073: Marking closures as executing exactly once

Matthew Johnson matthew at anandabits.com
Fri May 6 22:24:39 CDT 2016



Sent from my iPad

> On May 6, 2016, at 10:10 PM, Andrew Bennett via swift-evolution <swift-evolution at swift.org> wrote:
> 
> Replies inline:
> 
>> On Sat, May 7, 2016 at 12:37 PM, Dave Abrahams via swift-evolution <swift-evolution at swift.org> wrote:
>> 
>> on Fri May 06 2016, Andrew Bennett <swift-evolution at swift.org> wrote:
>> 
>> > Hi Dave,
>> >
>> > Sorry, Dave, sending a second time as I forgot to Reply-All.
>> >
>> > I agree, this proposal doesn't allow multiple closures where only one of them
>> > should be run, and it should only be run once. I personally don't think lacking
>> > that functionality is worth blocking this proposal for, another proposal can be
>> > built on top of this if it is desired.
>> >
>> > These cases can also be handled by a more meaningful if/switch statement, using
>> > @noescape(once), for example:
>> > let x: Int
>> > functionThatCallsAClosure(someTest()) { x = $0 ? 1 : 2 }
>> 
>> Why is this better than
>> 
>>     let x = functionThatCallsAClosure(someTest()) { $0 ? 1 : 2 }
>> 
>> ?
>> 
> 
> I'm not saying it's better, neither is the proposal. I do think both are better than this though:
> 
>     functionThatActsLikeIf( someTest(), then: { x = 1 }, else: { x = 2} )
> 
> My opinion is that cases where the proposal are limited by multiple closures seem to be cases where you would be better off with a single closure and more explicit control-flow. I'd be interested if there are other cases, but it currently seems like a straw-man argument to me.
> 
> --
> 
> It may be useful if Swift allowed things like this:
> 
> let x = switch { ... }
> let x = if { ... } else { ... }
> etc.
>  
> I think that's a much larger change/discussion, with no clear victor.
> 
> However until Swift has that support it's necessary to consider separated initialization and declaration. Likewise until all Swift is pure functional.
> 
> Even if this proposal didn't let you assign to let statements outside the closure it still has value:
> It lets the type system reduce programmer error
> It allows protocol declarations to have a more explicit requirement
> The user can guarantee that their code, and its side-effects, will be executed

+1.

> 
>> IMO separating initialization from declaration is *very* rarely needed
>> and very much better avoided altogether, because it leads to code that's
>> less clear.  Just because we *can* do this doesn't mean we should.
>> 
>> > On Sat, May 7, 2016 at 6:24 AM, Dave Abrahams via swift-evolution
>> > <swift-evolution at swift.org> wrote:
>> >
>> >     on Tue May 03 2016, Chris Lattner
>> >     <swift-evolution at swift.org> wrote:
>> >
>> >     > Hello Swift community,
>> >     >
>> >     > The review of "SE-0073: Marking closures as executing exactly once"
>> >     > begins now and runs through May 9. The proposal is available here:
>> >     >
>> >     >
>> >     https://github.com/apple/swift-evolution/blob/master/proposals/0073-noescape-once.md
>> >
>> >     >
>> >     > Reviews are an important part of the Swift evolution process. All reviews
>> >     should be sent to the swift-evolution mailing list at
>> >     >
>> >     > https://lists.swift.org/mailman/listinfo/swift-evolution
>> >     >
>> >     > or, if you would like to keep your feedback private, directly to the
>> >     review manager.
>> >     >
>> >     > What goes into a review?
>> >     >
>> >     > The goal of the review process is to improve the proposal under review
>> >     > through constructive criticism and contribute to the direction of
>> >     > Swift. When writing your review, here are some questions you might
>> >     > want to answer in your review:
>> >     >
>> >     > * What is your evaluation of the proposal?
>> >
>> >     I think it's of questionable importance and doesn't generalize well.
>> >     For example, you can't use this to construct something like
>> >
>> >     var x: Int
>> >     functionThatActsLikeIf( someTest(), then: { x = 1 }, else: { x = 2} )
>> >
>> >     If you need to initialize something in an outer scope with something
>> >     computed by a closure, it's much better to arrange something like this:
>> >
>> >     var x = functionThatActsLikeIf( someTest(), then: { 1 }, else: { 2 } )
>> >
>> >     --
>> >     Dave
>> >
>> >     _______________________________________________
>> >     swift-evolution mailing list
>> >     swift-evolution at swift.org
>> >     https://lists.swift.org/mailman/listinfo/swift-evolution
>> >
>> > _______________________________________________
>> > swift-evolution mailing list
>> > swift-evolution at swift.org
>> > https://lists.swift.org/mailman/listinfo/swift-evolution
>> 
>> --
>> Dave
>> 
>> _______________________________________________
>> swift-evolution mailing list
>> swift-evolution at swift.org
>> https://lists.swift.org/mailman/listinfo/swift-evolution
> 
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160506/7d8b4fcd/attachment.html>


More information about the swift-evolution mailing list