[swift-evolution] [Pitch] Improving capturing semantics of local functions

Robert Widmann devteam.codafi at gmail.com
Wed Nov 15 01:25:47 CST 2017


A quick thing I noticed on a first read (sort of tangential to the rest of the discussion) is that it would be a good idea to land warnings for potential reference cycles sooner rather than later.

I have an (un-rebased) branch that lays out what parts of Sema needs to be touched to make this happen and have SR-1807 (https://bugs.swift.org/browse/SR-1807) open for this in general if anybody would like to pick this up and carry it over the goal line.  Note that it’s not quite a starter bug.

Otherwise I’ll allocate time to it later on this winter.

~Robert Widmann 

2017/11/15 2:01、David Hart via swift-evolution <swift-evolution at swift.org>のメール:

> 
> 
>> On 15 Nov 2017, at 03:56, Howard Lovatt via swift-evolution <swift-evolution at swift.org> wrote:
>> 
>> Having read all the arguments for what to add to local functions it still strikes me as a poor use of engineering resources to fix them (though I do agree they have problems). A better use of resources would be:
>> 
>>   1. Deprecate local functions.
> 
> Even if I agreed, which I don’t, I’m fairly sure it’s much too late in Swift’s timeline to deprecate something as huge as local functions.
> 
>>   2. Allow closures when assigned to a function type to be:
>>       2a. Recursive.
>>       2b. Annotatable with:
>>             2bi.  @inline
>>             2bii. @escaping
>>       2c. Generic.
>> 
>> That would be a similar engineering effort and give a better short term result of better closures which would be much more widely applicable as well as addressing the issues with local functions.
>> 
>> It also gives a better long term result of not having to maintain local functions.
>>   
>> 
>>   -- Howard.
>> 
>>> On 15 November 2017 at 09:08, Alex Lynch via swift-evolution <swift-evolution at swift.org> wrote:
>>> The inference algebra just suggested was enjoyable to read, but is still a new syntax. Which is interesting and deserving of its own proposal. The purpose of this proposal is simply to introduce the existing capture syntax to local functions. Thanks to everyone's feedback pointing out that the `self` reference analysis is a deeper question than initially realized. 
>>> 
>>> Alex
>>> 
>>>> On Tue, Nov 14, 2017 at 4:36 PM, Mike Kluev via swift-evolution <swift-evolution at swift.org> wrote:
>>>>> On 14 November 2017 at 21:02, David Hart <david at hartbit.com> wrote:
>>>> 
>>>>> 
>>>>> 
>>>>> I’d be very hesitant to introduce this syntax:
>>>>> 
>>>>> it’s new syntax, so it comes with a complexity tax (it isn’t naturally obvious what it means for a func to be weak)
>>>>> it’s only sugar for the capture of self
>>>> 
>>>> it might cover well over 90% of use cases (by my "pessimistic" estimate)... if someone has a quick way to scan and analyse, say, github swift sources we may even know that current percentage number of real life usage.
>>>>> it doesn’t transpose well to local closures
>>>> 
>>>> the last one - maybe not. follow me:
>>>> 
>>>> let closure = { [weak self, bar] in ... }
>>>> 
>>>> which today can be written as: 
>>>> 
>>>> let closure = { [weak self, bar] () -> Int in ... } // full form
>>>> 
>>>> or as:
>>>> 
>>>> let closure: () -> Int = { [weak self, bar] in ... } // full form
>>>> 
>>>> which allows this change:
>>>> 
>>>> let closure:  [weak self, bar] () -> Int = { ... } // full alt form
>>>> 
>>>> or in alternative form:
>>>> 
>>>> let closure:  weak () -> Int = { [bar] in ... } // short hand form
>>>> 
>>>> same can be with functions:
>>>> 
>>>> func fn() -> Int { [weak self, bar] in ... } // full form
>>>> 
>>>> weak func fn() -> Int { [bar] in ... } // short hand form
>>>> 
>>>> the two capture attributes will in practice be "close" to each other:
>>>> 
>>>> weak func fn() {
>>>>     [bar] in
>>>>     ....
>>>> }
>>>> 
>>>> and in majority of cases there will be only weak self:
>>>> 
>>>> weak func fn() {
>>>>     ....
>>>> }
>>>> 
>>>> Mike
>>>> 
>>>> 
>>>> _______________________________________________
>>>> 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
>>> 
>> 
>> _______________________________________________
>> 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/20171115/b1ac0102/attachment.html>


More information about the swift-evolution mailing list