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

时间:2017-10-31 10:46:36

标签: metaprogramming perl6

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

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

1 个答案:

答案 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 ...那样声明它们。