> On Nov 29, 2017, at 07:25, Chris Lattner via swift-evolution 
> <swift-evolution@swift.org> wrote:
> 
> 
>> On Nov 29, 2017, at 12:46 AM, Brent Royal-Gordon <br...@architechies.com> 
>> wrote:
>> 
>>> On Nov 28, 2017, at 8:35 PM, Chris Lattner <clatt...@nondot.org> wrote:
>>> 
>>> We’ve had a lot of discussions over the years about how to balance 
>>> simplicity vs power, implicitness vs explicitness, intentionality vs 
>>> accidental behavior, etc.  For example, in very early discussions about 
>>> Swift generics, some folks where strong proponents of protocol conformance 
>>> being fully implicit: satisfying all the requirements of a protocol meant 
>>> that you conformed to it, even if you didn’t explicitly “inherit” from it.
>>> 
>>> This is obviously not the design we went with over the long term, and I’m 
>>> glad we didn’t.
>> 
>> I get that, but an attribute in particular would be just as explicit as a 
>> protocol conformance.
> 
> Sure, I’m not attached to spelling.  I think that conformance is the right 
> way to do this (following the pattern of the other ExpressibleBy etc types), 
> but if you have a compelling argument for some specific spelling, I’m more 
> than happy to discuss it.

I completely agree that protocol conformance is the right away to do it. One 
similar approach is Scala’s Dynamic 
<https://blog.scalac.io/2015/05/21/dynamic-member-lookup-in-scala.html> 
protocol.

I can’t think of a good “-able” word for this. "DynamicMemberLookupProtocol" is 
probably good enough IMO.

-Richard

> 
>>> I think that DynamicMemberLookup requiring conformance is the same thing: 
>>> it makes it explicit that the behavior is intentional, and it allows 
>>> somewhat better error checking (if you conform to the protocol but don’t 
>>> implement the (implicitly known) requirement, you DO get an error).  That 
>>> said, this is just my opinion.  
>> 
>> So you envision that the compiler knows that 
>> `DynamicMemberLookupProtocol`-conforming types ought to have 
>> `subscript(dynamicMember:)` members, and these members ought to have certain 
>> traits (unary, ExpressibleByStringLiteral parameter, etc.), and it should 
>> enforce those traits, even though there's no matching requirement in the 
>> protocol?
> 
> Yes, this is implemented in the patch, it is a straight-forward additional 
> check in protocol conformance.
> 
> Keep in mind that the compiler has other similar things for features that are 
> not expressible in the Swift type system, e.g. the type(of:) function.
> 
>> That seems like a lot of compiler magic to attach to a particular protocol. 
>> A `@dynamicMember` attribute would have a similar amount of magic, but 
>> people *expect* that kind of magic from an attribute. For instance, the 
>> `@objc` attribute places lots of conditions on the types of parameters, 
>> etc., and nobody is surprised by that.
> 
> I don’t really think that’s the case.  Attributes have their place, for sure, 
> but there in high precedent for Protocols providing exposing language 
> features to types.
> 
>> 
>> Other reasons to prefer an attribute:
>> 
>> * I can't think of a use case where you would want dynamic members but not 
>> want to make the subscript itself accessible. If `@dynamicMember` could be 
>> applied to any subscript, then you could use any label (or no label) for 
>> sugar-free use of the dynamic functionality. For instance, the JSON example 
>> could decorate its existing subscript instead of introducing a redundant one:
> 
> I see the small advantage, but isn’t precedented at all.  The ExpressibleBy 
> protocols require redeclaring redundant methods just like this.
> 
>> * If we eventually want to support multiple subscripts with different types 
>> (either by using different return types, 
> 
> This is already supported in the patch, and the patch includes a test case.
> 
>> Basically, you're using a hammer to drive a screw. Why not use a screwdriver 
>> instead?
> 
> I don’t see a connection between this rhetorical mechanic and the topic at 
> hand :-)
> 
> -Chris
> 
> _______________________________________________
> 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