语法 – Perl 6是否应该能够解释来自不同来源的相同角色的包含?
想象一下代表角色的一系列复杂语法,尽管这个简单的例子足以显示冲突:
role Alpha { token alpha { :i <[A..Z]> } } role Digit { token digit { <[0..9]> } } role Either does Alpha does Digit { token either { <alpha> | <digit> } } grammar Thingy does Either does Alpha { token TOP { <alpha> <either>* } } my $match = Thingy.parse( '1a3' ); dd $match; 这不起作用,因为Perl 6没有解开关系,以确定冲突实际上是来自同一来源的相同内容:
但是,阅读S14,我看到:
我读到这意味着角色尽可能晚地应用,因此Thingy类能够解开Alpha包含在两个不同的部分.我认为这可能会像创建构成最终类的所有角色的列表,然后将该列表仅应用于最终类.这样,像Either这样的东西只混合它定义的东西,并依赖于后来的构图来引入Alpha. 当我尝试为各种(IETF)RFC实现语法时,我碰到了这个问题.其中许多引用了其他RFC的语法,这使得Perl 6无法通过C3解析继承.所以,我认为角色会断开关系.显然它没有. 解决方法
是的,Perl 6应该能够解开来自不同来源的相同角色的包含.
role的简单definition是:
要么
因此,假设我们对可以在水上浮动的对象具有Floatable行为,并且对于可以航行的对象具有Sailable行为.当然,可以航行的物体可以漂浮. Sloop天然可浮动且可以播放. Floatable和Sailable角色都传达了相同的Floatable行为,这一事实没有冲突. 在Perl中,这可以按预期工作(它也适用于Moose): #!/usr/bin/env perl use v5.24; # why not use warnings; package Floatable { use Moo::Role; sub float { say "float" } } package Sailable { use Moo::Role; with 'Floatable'; sub sail { $_[0]->float; say "sail" }; } package Sloop { use Moo; with qw( Floatable Sailable ); } my $s = Sloop->new; $s->sail; 这种行为是直观明显的行为. 在查看Perl6 documentation for roles时我注意到的一个问题是缺少简单的一句话定义:
…
显然,当perl6遇到两个提供完全相同行为的角色时,它会认为这是一种我认为不合理的冲突. 请注意以下示例中的细微区别: #!/usr/bin/env perl use v5.24; # why not use warnings; package Floatable { use Moo::Role; sub float { say "float" } } package Sailable { use Moo::Role; sub float { say "floating bonds to finance journey "} sub sail { $_[0]->float; say "sail" }; } package Sloop { use Moo; with qw( Floatable Sailable ); } my $s = Sloop->new; $s->sail; 在这种情况下,可能会发生冲突,因为两个不同的角色想声称提供相同的行为. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |