[swift-evolution] Making capturing semantics of local

Johannes Weiß johannesweiss at apple.com
Fri Oct 27 11:52:54 CDT 2017



> On 27 Oct 2017, at 6:27 am, Howard Lovatt via swift-evolution <swift-evolution at swift.org> wrote:
> 
> > Closures cannot replace all uses of local functions. Local functions can be recursive, and have a generic parameter list.
> 
> My response would be add these featurtes to closures, it will make closures better.
> 
> In terms of recursion you can fiddle it:
> 
> struct RecursiveClosure<C> {
>     var c: C! = nil
> }
> func factorial(_ n: Int) -> Int {
>     var recursive = RecursiveClosure<(Int) -> Int>()
>     recursive.c = { x in
>         (x == 0) ? 1 : x * recursive.c(x - 1)
>     }
>     return recursive.c(n)
> }
> factorial(5) // 120

sorry, offtopic to the thread but that you can have easier with the fixed-point combinator (https://en.wikipedia.org/wiki/Fixed-point_combinator)

// the fixed-point combinator
func fix<T>(_ f: @escaping ((@escaping (T) -> T) -> (T) -> T)) -> (T) -> T {
    return { (x: T) in (f(fix(f)))(x) }
}

// demo
let fact = fix { fact_ in { n in n == 1 ? 1 : n * fact_(n-1) } }
for i in 1..<10 {
    print(fact(i))
}

-- Johannes


> 
>   -- Howard.
> 
> On 27 October 2017 at 15:53, Slava Pestov <spestov at apple.com> wrote:
> 
> 
>> On Oct 26, 2017, at 9:52 PM, Howard Lovatt <howard.lovatt at gmail.com> wrote:
>> 
>> It would be easy to provide a fixit.
> 
> That is still a source breaking change that requires migration, though.
> 
>> How often are they actually used? I rarely use them and all my use cases could be a closure instead. 
>> 
>> Also see Mike Kluev example; local functions are arguably worse than closures in all cases (provided that you can appropriately annotate the function type).
> 
> Closures cannot replace all uses of local functions. Local functions can be recursive, and have a generic parameter list.
> 
> Slava
> 
>> 
>>   -- Howard.
>> 
>> On 27 October 2017 at 12:26, Slava Pestov <spestov at apple.com> wrote:
>> 
>> 
>>> On Oct 26, 2017, at 4:45 PM, Howard Lovatt via swift-evolution <swift-evolution at swift.org> wrote:
>>> 
>>> Rather than expand local function syntax why not deprecate local functions completely
>> 
>> I don’t think at this point such a drastic change to the language is likely to happen.
>> 
>> Slava
>> 
> 
> 
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution



More information about the swift-evolution mailing list