> On Jun 2, 2016, at 2:43 PM, Brent Royal-Gordon <br...@architechies.com> wrote:
>> In my opinion, using this initializer-call syntax to build an 
>> explicitly-typed literal is an obvious and natural choice with several 
>> advantages over the "as" syntax.  However, even if you disagree, it's clear 
>> that programmers are going to continue to independently try to use it, so 
>> it's really unfortunate for it to be subtly wrong.
> 
> I've seen developers do this; in one memorable case, it resulted in Swift 
> taking a ridiculously long time to typecheck an expression, since the 
> seemingly pinned-down types of the literals had actually become *more* 
> ambiguous, not less.

Yes, this would also tend to improve compile times, since currently we end up 
generating a massively-ambiguous constraint system which must be resolved by 
type defaulting.  That's not really why I'm proposing this, though.

> However, it's not difficult to teach developers to use `as`. Usually what's 
> happening is that their mental model of the language is wrong: they think of 
> `UInt16(foo)` as a cast to a primitive type, and are surprised to learn that 
> it's actually an initializer on a struct and they're initializing an 
> instance. Learning this helps them understand how the language works, what 
> the difference is between initializers and `as`, and how they can write the 
> same things they see in the standard library types.

So, you think that this syntax is enticing to new developers who naturally 
think that the feature works the way that I'm proposing it should work, and you 
think that the right solution is to make the syntax illegal so that you can 
more conveniently tell them it doesn't work that way? :)

You can still tell them that it's a struct and you're calling an initializer on 
it; it's just that the initializer chosen is the special literal initializer 
because the argument is a literal.

John.



> 
> I think *actually* turning this into magic would be counterproductive. The 
> better solution is to make the compiler replace me in that story, by having 
> it emit a warning with a fix-it. It keeps initializer calls meaning exactly 
> what they say. (And it doesn't require an evolution proposal to do, since you 
> can add a warning with a mere bug.)
> 
>       UInt16(42)
>       ^~~~~~ ^~
>       Use of initializer with integer literal does not cast '42' to 'UInt16'
>       Fix-It: Replace with '42 as UInt16'
> 
> -- 
> Brent Royal-Gordon
> Architechies
> 

_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to