[swift-evolution] Ad hoc enums / options
Matthew Johnson
matthew at anandabits.com
Sat Jun 4 07:03:36 CDT 2016
Sent from my iPad
> On Jun 3, 2016, at 10:27 PM, Félix Cloutier <felixcca at yahoo.ca> wrote:
>
> If there's any interest in going down that road, it seems to me that the only viable option is to allow subsets to be convertible to their superset. Items of (.foo | .bar) would be convertible to (.foo | .bar | .baz), but not the opposite (and not necessarily, although preferably, through a simple bitcast).
Yes, I suppose in this case implicit convertibility would suffice. Thanks for bringing it up. It is effectively a subtype relationship.
>
> Félix
>
>>> Le 3 juin 2016 à 16:20:18, Greg Parker via swift-evolution <swift-evolution at swift.org> a écrit :
>>>
>>>
>>>> On Jun 1, 2016, at 5:42 PM, Matthew Johnson via swift-evolution <swift-evolution at swift.org> wrote:
>>>>
>>>>> On Jun 1, 2016, at 5:02 PM, Vladimir.S via swift-evolution <swift-evolution at swift.org> wrote:
>>>>>
>>>>> in other words, we could consider allowing this:
>>>>> func foo(bar: (.fit | .fill)) {
>>>>> baz(bar: bar)
>>>>> }
>>>>> func baz(bar: (.fit | .fill | .florp) { ... }
>>>>>
>>>>> In other words, an ad hoc enum T can be used wherever an ad hoc enum U is
>>>>> expected if T ⊆ U.
>>>>
>>>> Can't agree with this. Just because the same analogue with tuples : differently defined tuples are different types. Tuples with different order of types in declaration - are different types. So I expect here instance of (.fit | .fill) `bar` is not of the same type as (.fit | .fill | .florp)
>>>
>>> They are not the same type but there is a structural subtype relationship between them. All values of type (.fit | .fill) are also values of type (.fit | .fill | .florp).
>>
>> What about disjoint types? Some values of type (.fit | .fill) are values of type (.fit | .florp) and some are not. I'm not a type system expert but my understanding is that this capability gets very complicated very fast.
>>
>>
>> What about the ABI? This sounds expensive to implement.
>>
>> Consider this set of ad-hoc enum types:
>>
>> (.a | .b)
>> (.c | .d)
>>
>> Naive implementation: we'll represent these things as ints, with .a=1, .b=2, .c=1, .d=2.
>>
>> The naive implementation breaks when a newly-loaded shared library or some library evolution adds this type:
>>
>> (.a | .b | .c | .d)
>>
>> In order to provide ABI stability in the face of arbitrary ad-hoc enum types we must ensure that every ad-hoc enum value has a globally unique ABI representation.
>>
>> You could constrain ad-hoc enum values to module or class boundaries and prevent creation of types that use values from different places. For example, if Foundation defines (.a | .b) then you can't define your own ad-hoc enum (.a | .b | .c) that is compatible with Foundation's value for .a. Then the implementation could use ordinary symbols. If usage of ad-hoc enums is not constrained then ordinary symbols don't work because there is no universally agreed-upon place where .a is defined.
>>
>> An implementation like ObjC's @selector or C/C++ weak definition would work, but those are expensive in memory overhead and launch time.
>>
>> You could give each linkage unit its own copy of the value that includes a string of the value's name plus an == operator that compares the name strings; that would avoid uniquing but would make some operations slow.
>>
>> In any case the performance of these things will not be comparable to ints nor to typical Swift enums that are encoded as ints.
>>
>>
>> --
>> Greg Parker gparker at apple.com Runtime Wrangler
>>
>>
>> _______________________________________________
>> swift-evolution mailing list
>> swift-evolution at swift.org
>> https://lists.swift.org/mailman/listinfo/swift-evolution
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160604/10f63044/attachment.html>
More information about the swift-evolution
mailing list