想象一下表示为角色的一系列复杂语法,尽管这个简单的例子足以显示冲突:
role Alpha { token alpha { :i <[A..Z]> } } role Digit { token digit { <[0..9]> } } role Either does Alpha does Digit { token either {| } } grammar Thingy does Either does Alpha { token TOP { * } } my $match = Thingy.parse( '1a3' ); dd $match;
这不起作用,因为Perl 6没有解开关系,以确定冲突实际上是来自同一来源的相同内容:
方法'alpha'必须由Thingy类解析,因为它存在于多个角色中
但是,阅读S14,我看到:
角色可能不会从类继承,但可能由其他角色组成.然而,直到课堂构成时间才评估这种"裙带"组合物.这意味着如果两个角色带来了同一个朋友,那就没有冲突 - 就好像这个类本身就引入了裙带角色而各自的角色没有.无论其结合方式如何,角色都不会与自身发生冲突.
我读到这意味着角色尽可能晚地应用,因此该课程Thingy
将能够解开Alpha
包含在两个不同部分中的角色.我认为这可以像创建构成最终类的所有角色的列表,然后将该列表仅应用于最终类.这样,类似的东西Either
只会混合它定义的东西,并依赖于后来的构图引入Alpha
.
当我尝试为各种(IETF)RFC实现语法时,我碰到了这个问题.其中许多引用了其他RFC的语法,这使得Perl 6无法通过C3解析继承.所以,我认为角色会断开关系.显然它没有.