> On Jun 2, 2016, at 12:57 PM, John McCall <rjmcc...@apple.com> wrote:
> 
>> On Jun 2, 2016, at 10:49 AM, David Sweeris <daveswee...@mac.com 
>> <mailto:daveswee...@mac.com>> wrote:
>> I’m not entirely sure what an “expr-collection” is.
> 
> Collection literals, e.g. [x,y,z] and [a: x, b: y].
Thought so, but I wasn’t sure. Thanks for clarifying :-)

> 
>> Does your proposal mean that in this code:
>> func foo() -> Int {...}
>> var w = 0
>> var x = T(foo())
>> var y = T(w)
>> var z = T(0)
>> different initializers would be used for `x`,`y`, and `z`?
> 
> z would be initialized using the literal initializer if T conforms to that 
> protocol, yes.
> 
>> If so, that seems a potential source of much subtler problems.
> 
> Note that this is only an issue for types that conform to the literal 
> protocols.

Oh, I know. The crux of my concern is that while the difference between 
`UInt16(7)` and `7 as UInt16` is subtle, it’s not that subtle… the literal 
convertible syntax doesn’t even look that much like a call to init, so it 
shouldn’t be that surprising if explicitly calling the init function might send 
you down a different code path. OTOH, this proposal silently (and invisibly) 
rewrites an explicit call to`init(_: Int)` to `init(integerLiteral: 
IntegerLiteralType)`, which seems worse. Again, I don’t disagree that there’s a 
subtlety here, but at least with the current behavior, the unexpected behavior 
comes from not paying attention to syntax.

>> I don’t disagree that you’ve identified a potential source of issues, but 
>> it’s conceivable that there might be circumstances where the "semantically 
>> very different results” are desired. I can’t think of any off the top of my 
>> head, but I’m not convinced that means they don’t exist.
> 
> I do not think that anybody writes UInt64(0) and *wants* the 0 to be built as 
> an Int and then coerced to UInt64.

I can’t think of why anyone would either — all my *LiteralConvertible types 
just pass on the literal arguments to an init that takes an Int (or whatever) — 
but “a failure of imagination…”

I guess I’m just saying that with the way Swift treats literals, potential 
confusion is inevitable, and that it’s better to contain the subtleties to 
syntax which already involves some implicit behavior, rather than to start 
rewriting explicit code simply because we think the programmer doesn’t know 
what they’re doing.

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

Reply via email to