> On Nov 27, 2017, at 12:54 PM, Dave DeLong <sw...@davedelong.com> wrote:
> 
> Hi Chris,
> 
> Some questions:
> 
> 1️⃣ How does the subscript approach work for dynamically passing in multiple 
> parameters? For example, what would “dog.addTrick(“Roll Over”, favorite: 
> true)” be when expressed as a subscript method? The subscript syntax only 
> really seems to suit property-style invocations, unless I’m missing something 
> obvious.
> 
> 2️⃣ It seems like “dog.add_trick(…)” would have a dynamic lookup name of 
> “add_trick”. What would the lookup name of “dog.add(trick: …)” be? Or in 
> other words, how do named parameters affect the lookup name?

Hi Dave,

Both of these questions are really about the other proposal, the 
DynamicCallable proposal:
https://gist.github.com/lattner/a6257f425f55fe39fd6ac7a2354d693d 
<https://gist.github.com/lattner/a6257f425f55fe39fd6ac7a2354d693d>

It isn’t as refined as the DynamicMemberLookup proposal, but the two do work 
together.

DynamicMemberLookup is only about changing how “x.y” resolves.


> 3️⃣ Can I implement the subscript method multiple times, or is only a single 
> implementation allowed?

Multiple implementations are allowed and are resolved through standard overload 
resolution. Here’s an extract from the test case in the patch:


// References to overloads are resolved just like normal subscript lookup:
+// they are either contextually disambiguated or are invalid.
+struct Ambiguity : DynamicMemberLookupProtocol {
+  subscript(dynamicMember member: String) -> Int {
+    return 42
+  }
+  subscript(dynamicMember member: String) -> Float {
+    return 42
+  }
+}
+
+func testAmbiguity(a : Ambiguity) {
+  let _ : Int = a.flexibility
+  let _ : Float = a.dynamism
+  _ = a.dynamism  // expected-error {{ambiguous use of 
'subscript(dynamicMember:)'}}
+}
+

> For example, in the JSON example, there’s currently only a dynamic member 
> subscript implementation that returns “JSON?”. Could I add another one that 
> returns “String?” and have the type checker choose the appropriate one based 
> on type inference?

Yes.  It is tricky to actually use such APIs, but they are definitely possible 
and work exactly like current overloads in Swift do.

> As far as naming goes, I’d propose “DynamicMemberForwarding”. In my mind, 
> “Lookup” and “Resolve” are inappropriate, because you’re not actually 
> “looking up” or “resolving” to a particular implementation. In Objective-C, 
> the “+resolveInstanceMethod” stuff expects you to *provide* a method 
> implementation (an IMP). On the other hand, if there isn’t a method 
> implementation (which is the case here), you end up in the 
> “-forwardInvocation:” path, where you can just introspect the NSInvocation 
> and do whatever it is you’re doing to do. So, it seems like this proposal 
> sounds a lot more like ObjC's “invocation forwarding” rather than the method 
> resolution; hence my preference for using “Forwarding” in the name for naming 
> consistency.

Sure, I’m not strongly attached to any of the names in the proposal.

-Chris

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

Reply via email to