为什么我不能在“ while”上称呼“ gist”? (Perl 6)

问题描述 投票:4回答:1

我可以在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中的所有内置功能实际上都是我们可以重新定义的功能。

perl6 raku
1个回答
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++ }
© www.soinside.com 2019 - 2024. All rights reserved.