> On Jun 27, 2016, at 8:29 AM, Dave Abrahams via swift-evolution 
> <swift-evolution@swift.org> wrote:
>> Second, I wonder if it might make more sense to name the protocols
>> `Syntax.IntegerLiteralInitializable`.  Dave has opposed
>> `Initializable` as a general convention because it implies pure syntax
>> and doesn’t carry any semantics.  But in this case the semantics *are*
>> essentially the syntax.  Erica pointed out to me off list that at the
>> usage site the `Syntax.IntegerLiteral` names could confuse somebody
>> into thinking in terms of *isa* rather than *can do* (i.e. Int is an
>> IntegerLiteral rather than Int can be *initialized* with an
>> IntegerLiteral).
> 
> Really, this is exactly the sense in which we want it to be interpreted.
> It is *not* a capability.  There is no such thing as an IntegerLiteral
> instance from which one can initialize an Int.  There are only syntactic
> integer literals, which, given the right type context, can be-a Int.
> The intializer one gets from the protocol is merely the mechanism used
> by the compiler to create this Int.


Starting with this:

    "Conforming to a protocol is supposed to be a strong declaration about not 
just syntax, but semantics" - D. Abrahams

Current:

        /// Conforming types can be initialized with integer literals.
        public protocol IntegerLiteralConvertible {
        
            associatedtype IntegerLiteralType
        
            /// Create an instance initialized to `value`.
            public init(integerLiteral value: Self.IntegerLiteralType)
        }


Maybe my issue is that this should really read:

        /// Conforming types accept integer literal syntax for initialization
        /// allowing types to use integer literals in statements
        ///
        /// ```
        /// let instance: T = *integer literal*
        /// ```
        /// 
        /// for example:
        /// 
        /// ```
        /// let myDouble: Double = 2 // The literal 2 is automatically cast
        /// let anotherDouble: Double = myDouble * 5 // The literal 5 is 
automatically cast
        /// ```
        public protocol Syntax.SupportsIntegerLiteralValues {

            ///  For constrained integer literal types, which otherwise default 
to `Int`.
            associatedtype IntegerLiteralType = Int
        
             /// Create an instance initialized to `value`. 
            ///  Required to enable in-line syntactic substitutions
            public init(integerLiteral value: Self.IntegerLiteralType)

        }

So a protocol of `Syntax.AcceptsIntegerLiteralValues` or 
`Syntax.AutoconvertsIntegerLiteralValues` might
better explain what this is doing and the intent of the protocol. It ain't 
short but it's a hella lot clearer.

-- E

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

Reply via email to