如何使用元编程在Perl 6中创建枚举?

pio*_*ojo 7 metaprogramming perl6

给定代表枚举的数据,例如:

my %enums := {
  Color => { red => 0, black => 1, green => 2 },
  Status => { fail => 0, pass => 1 }
};
Run Code Online (Sandbox Code Playgroud)

如何使用Metamodel::ClassHOW创建等效于以下内容的枚举:

enum Color ( red => 0, black => 1, green => 2 );
enum Status ( fail => 0, pass => 1 );
Run Code Online (Sandbox Code Playgroud)

Timo的ADT库提供了一个如何创建类的示例ClassHOW,但它不包含枚举:https://github.com/timo/ADT/blob/master/lib/ADT.pm6

mor*_*itz 6

这似乎可以解决问题,但它几乎未经测试:

my %enums := {
  Color => { red => 0, black => 1, green => 2 },
  Status => { fail => 0, pass => 1 }
};
my @types = gather {
    for %enums.kv -> $name, %values {
        my $type = Metamodel::EnumHOW.new_type(:$name, base_type => Int);
        for %values -> $pair {
            $type.^add_enum_value($pair);
        }
        $type.^add_role(Enumeration);
        $type.^add_role(NumericEnumeration);
        $type.^compose;
        take $type;
    }
}.list;
say @types;     # Output: [(Status) (Color)]
Run Code Online (Sandbox Code Playgroud)

请注意,这会将类型放入数据结构中,因为词法作用域在运行时是不可变的,因此您无法像使用它那样声明它们enum Color ....