Why are subscripts so different, anyway? One would think they are basically sugared functions, but they don’t support so many things that regular functions support. Not just syntax stuff, either - they also don’t support @inline(__always) for some reason…
Where generic subscripts are concerned, there are a couple of different things to express:
- Generic parameter (I can understand various co-ordinates for the data)
- Generic return type (I can construct your preferred representation of the data)
- Generic setter type (I can set the data using various compatible types):
protocol MeaningfulToFoo {}
protocol ConstructableFromFoo {}
struct Foo {
subscript<Index>(index: Index) where Index: SignedInteger {
get<T> where T: ConstructableFromFoo { return T(self) }
set<U> where T: MeaningfulToFoo { self.someProperty = newValue.someData }
}
}
The syntax looks a bit awkward, though, IMO. I’m wondering if it might be better to have some kind of combined subscript + property behaviours (remember those?) and allow those to be generic instead. Subscripts and properties are very similar anyway - they are both bundles of functions to represent getting and setting data (not just regular-old “get” and “set”, either, but also magic stuff like “mutableAddressWithPinnedNativeOwner”). The only difference is that property getters can’t have parameters — which is something I would also like to see lifted one day (I believe I’ve even seen people asking for “named subscripts” due to the lack of this =P)
- Karl
···
On 12 Jan 2017, at 22:37, Slava Pestov via swift-evolution <swift-evolution@swift.org> wrote:
On Jan 12, 2017, at 9:53 AM, Chris Eidhof via swift-evolution <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
Ok, I've got a draft up as a gist: generic-subscripts.md · GitHub
Before I submit it, could someone let me know if adding generics to subscripts would influence the ABI? ( still feel pretty clueless in that area).
It won’t change the ABI of existing subscript calls, but if the standard library introduces new generic subscripts that replace older non-generic subscripts, it will impact ABI.
Slava