我可以在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
不是&#34;例程&#34;但say
是。但我认为Perl 6中的所有内置函数都是我们可以重新定义的函数。
答案 0 :(得分: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++ }