[swift-evolution] 100% bikeshed topic: DictionaryLiteral

Chris Lattner clattner at nondot.org
Wed Jan 10 00:29:49 CST 2018


Disclaimer: I’m reordering your comments below to suit my nefarious purposes: :-)

On Jan 9, 2018, at 3:48 PM, Ben Cohen <ben_cohen at apple.com> wrote:
>> More to the point though, this seems like an implementation detail of Mirrors.  What is the plan for Mirrors + ABI stability?
>> 
> 
> Absent a proposal to change them to something better (and I’m not aware of one pending), the plan is they are what they are, at least the public API of Swift.Mirror. I would guess this whole area is a candidate to be overhauled significantly at some point in the post-Swift 5 future with some more fully-fledged reflection system, but there is little chance of this happening before ABI stability, and interim tinkering doesn’t seem worthwhile to me.

Ok, I understand that (among all the other things going on that are clearly more important) revamping this is probably not the highest priority thing to do.  That said, it would be really unfortunate to carry around these “suboptimal” APIs forever, particularly given how marginal they are (as in, not widely used).  I’m sure that there are other examples beyond these that are similarly unfortunate.

Given that, I have a meta question for you: have you considered an approach where you take the Swift standard library and split it into two conceptual pieces:

1) The "ABI stable” subset of the library that gets burned into the OS.
2) The “ABI unstable” subset, which gets statically linked into apps, just like the Swift 4 library used to?

Given that “import Swift” is implicit anyway, you could just have the compiler implicitly import *both* of these modules.  


The point of doing this is that it gives you a very general and low friction way to handle compatibility gunk.  In addition to putting obscure stuff like Mirror and “DictionaryLiteral” into this (without breaking source code!) you now get the ability to put the various deprecated forwarding functions in this module as well, avoiding them becoming part of the ABI.

The nice thing about this is that only people who use these things would have to pay the cost, and you can directly message this by deprecating all the stuff in it.  Think about it as an overlay for the Swift standard library :-)

>> +1 for renaming it to something that isn’t super confusing, but +100 for removing it outright.
>> 
>> Rationale: if we didn’t have this functionality in the stdlib today, we would not consider adding it.  It doesn’t meet the bar we’ve set for what is in the standard library.  It only exists there by historical accident.  The Mirror API was not carefully considered.
>> 
> 
> Personally, I feel like this argument for removal as past its use-by date. It was a good reason for Swift 3, tenuous for 4 and should be ruled out for 5, since the source stability bar has been raised since. Like I said, IMO the criteria should now be “active harm”. I also don’t think searches of GitHub etc are sufficient justification, except when combined with the active-harm argument. I also don’t think the origin story of the type – whether accidental or intentional – is relevant to the decision of what to do with it now. It exists and people can legitimately use it for their own purposes independent of mirrors.

I’m generally in agreement with you, but in this specific case, I seriously doubt people are using this.  All rules are malleable in the right circumstances.

More importantly though, if we had a meta design that allowed to gracefully phase this sort of thing out (without it becoming part of ABI under any name) there becomes very little cost to leaving it around in the “abi unstable” library for…. ever if need be.  Given that, I would have much less objection to keeping it around.

-Chris



More information about the swift-evolution mailing list