当前位置: 首页 > 知识库问答 >
问题:

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

邵崇凛
2023-03-14

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

my %enums := {
  Color => { red => 0, black => 1, green => 2 },
  Status => { fail => 0, pass => 1 }
};

如何使用Metamodel::ClassWay创建枚举等效于:

enum Color ( red => 0, black => 1, green => 2 );
enum Status ( fail => 0, pass => 1 );

Timo的ADT库给出了一个如何使用ClassWay创建类的示例,但它不涵盖枚举:https://github.com/timo/ADT/blob/master/lib/ADT.pm6

共有1个答案

颛孙哲
2023-03-14

这似乎能奏效,但大部分未经测试:

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)]

注意,这会将类型放入数据结构中,因为词法作用域在运行时是不可变的,所以不能像使用枚举颜色那样声明它们

 类似资料:
  • 我正在尝试创建一个语法。到目前为止,这是我的代码: 我真的只是希望语法从输入中创建一个列表/哈希表树。代码的输出是: 看起来还不错。perl6似乎在解码这样一个事实,即字段描述符由多个字段描述符组成,但实际上似乎并没有将它们放入列表中。我可以说$fds ,但我不能说$fds[0] 。为什么前者“起作用”,而后者不起作用? 我必须承认,我对正在发生的事情掌握得相当薄弱。使用规则而不是令牌会更好吗?我

  • 我正在使用Windows 7和10。我想知道如何在Perl6中创建一个弹出窗口来向用户提供信息?类似Linux的发送通知或Windows Pro msg(没有网络) 非常感谢,-T

  • 问题内容: 当我阅读 Effective Java时 ,作者告诉我,单元素类型是实现单例的最佳方法,因为我们不必考虑复杂的序列化或反射攻击。这意味着我们无法创建使用反射的实例,对吗? 我已经做了一些测试,并在这里上课: 然后我尝试创建一个实例: 如您所知,它不起作用。当我更改关键字来,它的工作原理。我想知道为什么。谢谢。 问题答案: 这是语言内置的。根据Java语言规范(§8.9): 尝试显式实例

  • 我有一个注释要求是编译时常量。我从下面的中获取: 我的s如下: 当我使用注解Kotlin需要是编译时常量。 注释实现本身: 我仔细研究了类似的问题,但没有找到解决方法。我还找到了一篇与这个主题相关的文章,但到目前为止没有任何效果。 附带说明:我不能更改注释,因为它来自库,我也不能更改库。 总而言之,有没有办法从静态编程语言中的编译时常量到注释中使用?

  • 问题内容: 我正在制作绘图应用程序,我想通过枚举引用我的颜色。例如,每次我想要红色时,使用它会更干净,更方便,而不用键入值。但是,Swift的原始值枚举似乎并不接受UIColor作为类型。有没有办法用枚举或类似方法做到这一点? 问题答案: 我这样做(基本上使用结构作为名称空间): 您可以像这样使用它: 因此,您可以在自定义主题中使用红色。

  • 问题内容: 我要做什么才能完成此任务?另外,可以说我将其更改为: 我该如何使它符合Decodable? EDit 这是我的完整代码(不起作用) 最终编辑 另外,它将如何处理这样的枚举? 问题答案: 这很简单,只需使用或隐式分配的原始值即可。 被编码到并到 要么 被编码到并到 这是一个简单的示例如何使用它: