我可以在gist
内置函数上调用say
方法:
&say.gist
sub say (| is raw) { #`(Sub|54790064) ... }
为什么我不能在gist
上呼叫while
?
&while.gist
===SORRY!=== Error while compiling <unknown file> Undeclared routine: while used at line 1
显然while
不是“常规”,但say
是。但是我认为Perl 6中的所有内置功能实际上都是我们可以重新定义的功能。
我以为Perl 6中的所有内置功能都是我们可以重新定义的功能。
while
不是例程或宏,而是Perl6's grammar中定义的部分语法。
如果要重新定义它,则必须创建您自己的语,目前它涉及黑魔法。
由于某些原因,我还没有弄清楚,它仅在模块中完成时才起作用(否则,%*LANG
似乎未定义)。
让我们调用模块froop.pm6
:
use nqp;
sub EXPORT {
nqp::bindkey(%*LANG, 'MAIN', nqp::atkey(%*LANG, 'MAIN').^mixin(role {
rule statement_control:sym<while> {
[$<sym>=froop{
$/.hash<sym>.^mixin: role {
method Str { 'while' }
}
}|$<sym>=until]<.kok> {}
<xblock>
}
}));
once Map.new
}
这将while
关键字(在语句位置)替换为froop
,例如
use froop;
my $i = 0;
froop $i < 5 { say $i++ }