为什么我不能打电话给#34;要点"在"而"? (Perl 6)

时间:2015-12-03 06:38:11

标签: perl6

我可以在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中的所有内置函数都是我们可以重新定义的函数。

1 个答案:

答案 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++ }