<div dir="ltr">I think what you&#39;re asking for here is essentially some sort of (or special case of) value subtyping, a topic near and dear to many.<div class="gmail_extra"><br></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Jul 31, 2017 at 7:43 PM, Ahmad Alhashemi via swift-evolution <span dir="ltr">&lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I’ve been writing an interpreter in Swift and have been finding enums incredibly useful. One feature thought that I thought would make life easier is the ability to create a super-enum that contains as its cases all the cases of its constituent enums:<br>
<br>
&gt; enum UnaryOperator {<br>
&gt;     case not<br>
&gt; }<br>
&gt;<br>
&gt; enum BinaryOperator {<br>
&gt;     case and<br>
&gt;     case or<br>
&gt; }<br>
&gt;<br>
&gt; case BooleanLiteral {<br>
&gt;     case `true`<br>
&gt;     case `false`<br>
&gt; }<br>
&gt;<br>
&gt; typealias Token = UnaryOperator | BinaryOperator | BooleanLiteral<br>
<br>
It would then be possible to do something like this:<br>
<br>
&gt; scanToken() -&gt; Token<br>
&gt;<br>
&gt; indirect enum Expr {<br>
&gt;     case binary(op: BinaryOperator, lhs: Expr, rhs: Expr)<br>
&gt; }<br>
<br>
For example, a number of functions in the recursive descent parser can only return a subset of all possible expressions.<br>
<br>
Of course it’s already possible to represent the same data structure like this:<br>
<br>
&gt; enum Token {<br>
&gt;     case binaryOperator(BinaryOperator)<br>
&gt;     case unaryOperator(UnaryOperator)<br>
&gt;     case booleanLiteral(BooleanLiteral)<br>
&gt; }<br>
<br>
Perhaps what I’m suggesting could just be syntactic sugar, but it’d make it much easier to switch over `Token` without worrying about all of the nested enums. The feature becomes even more useful if you think about a deeper hierarchy of enums. It would bring some of the power of protocols/POP to enums.<br>
<br>
This raises a few questions such as:<br>
- Case name collisions<br>
- Associated types<br>
- Raw values<br>
<br>
But I can’t think of anything that cannot be addressed with sensible rules and conditions.<br>
<br>
Interested to read your thoughts.<br>
<br>
-Ahmad<br>
______________________________<wbr>_________________<br>
swift-evolution mailing list<br>
<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br>
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/<wbr>mailman/listinfo/swift-<wbr>evolution</a><br>
</blockquote></div><br></div></div>