[swift-evolution] [Pitch] Move @noescape
Chris Lattner
clattner at apple.com
Thu Mar 3 18:04:05 CST 2016
> On Mar 3, 2016, at 3:01 PM, Brent Royal-Gordon <brent at architechies.com> wrote:
>
>> I suppose that makes sense.
>
> Sorry to double-post, but I'm actually rethinking @autoclosure.
>
> My feeling is that we should only attach information to the *type* if it follows the value around and if, at least in principle, it would make sense in at least some other type-like contexts.
I think it does, and let me illustrate why. Consider an autoclosure-taking function like this (one silly example):
func f(@autoclosure a : () -> ()) {}
You can use it as you’d expect, e.g.:
f(print("hello”))
Of course, f is a first class value, and you can assign it:
let x = f
x(print("hello"))
This works, because x has type "(@autoclosure () -> ()) -> ()”. You can see this if you force a type error:
let y : Int = x
// error: cannot convert value of type '(@autoclosure () -> ()) -> ()' to specified type 'Int'
However, you can’t write this out explicitly:
let x2 : (@autoclosure () -> ()) -> () = f
// error: attribute can only be applied to declarations, not types
This seems dumb to me :-) you should be able to write the type for any declaration you can produce. Once you do that, it makes sense to spell the original function as:
func f(a : @autoclosure () -> ()) {}
for consistency. Yes, I totally get the irony of the fact that @autoclosure used to be on the type in swift 1.
-Chris
More information about the swift-evolution
mailing list