给出代表枚举的数据,例如:
my %enums := {
Color => { red => 0, black => 1, green => 2 },
Status => { fail => 0, pass => 1 }
};
如何使用Metamodel::ClassHOW
创建等效于:
enum Color ( red => 0, black => 1, green => 2 );
enum Status ( fail => 0, pass => 1 );
Timo的ADT库提供了一个如何使用ClassHOW
创建课程的示例,但它不包含枚举:https://github.com/timo/ADT/blob/master/lib/ADT.pm6
答案 0 :(得分: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)]
请注意,这会将类型放入数据结构中,因为词法作用域在运行时是不可变的,因此您无法像enum Color ...
那样声明它们。