On Fri, Aug 16, 2024, at 16:17, Larry Garfield wrote:
> On Fri, Aug 16, 2024, at 6:35 AM, Alexandru Pătrănescu wrote:
> > Hi Nick,
> >>
> >> Is there any interest in having enums as class constants?
> >>
> >> I'm often finding cases where I would like to have an enum inside of a
> >> class, but don't want a free-floating enum that's basically like
> >> another class.
> >>
> >
> > ...<snip>...
> >
> >>
> >> class SSHClient {
> >>
> >> public const enum CommandResult
> >> {
> >> case Success;
> >> case Failure;
> >> case Unknown;
> >> case Timeout;
> >> }
> >>
> >> // ...
> >> }
> >>
> >>
> >> // Usage:
> >>
> >> SSHClient::CommandResult::Success
> >
> >
> > I feel this topic could be maybe more broad and be called "nested
> > classes" that are already supported in multiple languages: Java, Swift,
> > Python, C#, C++, JavaScript, etc.
> >
> > The syntax you showed is usually identical with what other languages
> > use, except that probably the const is unnecessary.
> > The nested class can have visibility as sometimes having it private
> > makes sense.
> > Accessing it through `::` is probably fine, but a deeper look at the
> > grammar might be necessary.
> > The nested class would have access to parent class private properties
> > and methods.
> >
> > I also mentioned this topic on the subject of defining a type in an
> > autoloader compatible way.
> > And indeed, a type could also be defined nested in a class if we want
> > to support that as well.
> >
> > Now, this feature is not simple, and I think it needs proper
> > sponsorship from someone experienced with internals.
> >
> > Regards,
> > Alex
>
> I agree with Alexandru. Since enums are 90% syntactic sugar over classes, "inner enums" would be 80% of the way to "inner classes". And I would be in favor of inner classes. :-) There's a lot of potential benefits there, but also a lot of edge cases to sort out regarding visibility, what is allowed to extend from what, etc. But that would support inner enums as well.
From recently looking into this for totally unrelated reasons, nested enums would be far easier to implement on a grammar level. Enums also have some constraints that make it simpler than the general “nested classes,” such as rules regarding inheritance.
As for the actual implementation, it’ll be the edges that kill you.
I would recommend just doing enums, and keep the scope smaller.