大佬教程收集整理的这篇文章主要介绍了语法 – 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解析继承.所以,我认为角色会断开关系.显然它没有.
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;
以上是大佬教程为你收集整理的语法 – Perl 6是否应该能够解释来自不同来源的相同角色的包含?全部内容,希望文章能够帮你解决语法 – Perl 6是否应该能够解释来自不同来源的相同角色的包含?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。