> On Jun 30, 2017, at 1:48 AM, Adrian Zubarev via swift-evolution 
> <swift-evolution@swift.org> wrote:
> 
> Well as Jordan Rose said on the linked SR, option (1) will probably never 
> happen. Option (3) only makes sense if all of the options are supported (in 
> that case there wouldn’t be any need for explicit @autoclosure, which could 
> simply be merged into the closure type), or (2) is NOT supported so that one 
> could pass a default autoclosure.
> 
> It leaves us only with (2), which is potentially a (small) breaking change, 
> but it also feels more like a fix. I cannot imagine anyone is wrapping whole 
> closures with auto closure, nor do I think a ‘convenience’ operation should 
> disable the explicit ability to pass in a closure with the same signature. 
> The latter feels like a bug. Furthermore I think most code that relies on 
> this is already doing something like.
> 
> func bar(_ closure: @autoclosure () -> Int) { foo(closure)}
> 
> func foo(_ closure: () -> Int)
> But this is only an assumption of mine.
> 
> Theoretically it suppose to work the other way around, right? Again 
> @autoclosure supposed to be a syntactical convenience feature which implies 
> that it won’t disable *too* much from the closure type. Disallowing arguments 
> is logical consequence but not the other issues I mentioned here and in the 
> SR.
> 
> —
> 
> One question: Do we need to go through a full evolution process for pitch (2) 
> or is a bug report enough here?
> 
Surely the former—I'm fully against this change, and imagine others are also. 
Autoclosure exists to provide opt-in lazy evaluation of values by wrapping them 
in a closure. I think it's semantically incorrect to accept an already wrapped 
value here, and adding this sort of implicit conversion can introduce potential 
ambiguity when used with generic functions.

Very large -1.
> 
> 
> -- 
> Adrian Zubarev
> Sent with Airmail
> 
> Am 30. Juni 2017 um 00:59:45, Beta (rwidm...@apple.com) schrieb:
> 
>> These are all interesting ideas at first blush, but introduce some oddities 
>> into the type system
>> 
>> 1. We accept this 😳.  If we were to take this as an official language change 
>> it would mean that we would allow coercing T to (_) -> T by emitting a 
>> closure that takes an argument list (of arity given by the contextual type) 
>> that we throw away anyways.  I would much prefer we diagnose this instead.  
>> @autoclosure is a syntactically convenient way to ask for laziness - that’s 
>> it.
>> 
>> 2. Doing this collapses overloads on @autoclosure
>> 
>> func foo(_ f : @autoclosure () -> String) {}
>> func foo(_ f : () -> String) {}
>> 
>> 
>> Which is fine by me except for the code you would break that relies on this. 
>>  I don’t see a reasonable migration path here - perhaps you have one in mind.
>> 
>> 3. @autoclosure is a parameter attribute.  Allowing it to appear in other 
>> positions is redundant and doesn’t actually accomplish anything outside of 
>> maintaining consistency with the first point.
>> 
>> I hope I don’t come off as too harsh.  It’s just a little shocking to me 
>> that we accept the code in the linked SR.
>> 
>> ~Robert Widmann
>> 
>>> On Jun 24, 2017, at 9:10 AM, Adrian Zubarev via swift-evolution 
>>> <swift-evolution@swift.org> wrote:
>>> 
>>> Hello folks,
>>> 
>>> Here is a quick and straightforward pitch about @autoclosure. Currently the 
>>> attribute indicates that the caller has to pass an expression so that the 
>>> braces can be omitted. This is a convenient behavior only, but it also has 
>>> it’s shortcomings.
>>> 
>>> I would like to propose an extension of that behavior.
>>> 
>>> 
>>> 1. Allow access to arguments and shorthand argument names:
>>> // Bug: https://bugs.swift.org/browse/SR-5296
>>> func foo(_ test: @autoclosure (Int) -> Int = { $0 }) {
>>>     print(test(42))
>>> }
>>> 
>>> // Convenient access using shorthand arguments
>>> foo(Int(Double($0) * 3.14)))
>>> 
>>> 2. Make @autoclosure only wrap when necessary:
>>> func bar(_ test: @autoclosure () -> Int) {
>>>     print(test())
>>> }
>>> 
>>> let test = { 42 }
>>> 
>>> // function produces expected type 'Int'; did you mean to call it with '()'?
>>> bar(test)
>>> 
>>> 3. Extend @autoclosure to closure types in general (this change is for 
>>> consistent alignment):
>>> // Note how we're using the shorthand argument list for this expression
>>> let uppercaseWrapper: @autoclosure (String) -> String = $0.uppercased()
>>> 
>>> 
>>> 
>>> -- 
>>> Adrian Zubarev
>>> Sent with Airmail
>>> 
>>> _______________________________________________
>>> swift-evolution mailing list
>>> swift-evolution@swift.org
>>> https://lists.swift.org/mailman/listinfo/swift-evolution
>> 
> 
> _______________________________________________
> swift-evolution mailing list
> swift-evolution@swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution
_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to