所有Perl 6引用构造都有术语优先权吗?

时间:2017-07-02 15:29:25

标签: perl6 operator-precedence raku

< >有术语优先权。这是example from the docs

say <a b c>[1];

我认为相同的优先级适用于所有引用运算符。这有效:

my $string = '5+8i';
my $number = <<$string>>;
say $number;

这会插入$string并创建allomorphes(在本例中为ComplexStr):

(5+8i)

但是,如果我尝试将其编入索引,就像文档中的示例一样,它就不会编译:

my $string = '5+8i';
my $number = <<$string>>[0];
say $number;

我不太确定Perl 6在这里发生了什么。也许它认为它是一个超级高手:

===SORRY!=== Error while compiling ...
Cannot use variable $number in declaration to initialize itself
at /Users/brian/Desktop/scratch.pl:6
------>     say $⏏number;
    expecting any of:
        statement end
        statement modifier
        statement modifier loop
    term

我可以跳过变量:

my $string = '5+8i';
say <<$string>>[0];

但这是一个不能找到结束语的错误:

===SORRY!=== Error while compiling ...
Unable to parse expression in shell-quote words; couldn't find final '>>'
at /Users/brian/Desktop/scratch.pl:8
------> <BOL>⏏<EOL>
    expecting any of:
        statement end
        statement modifier
        statement modifier loop

2 个答案:

答案 0 :(得分:7)

我认为这需要一封rakudobug电子邮件。我认为解析器在尝试将其解释为hyper(又名>>.method)时感到困惑。以下解决方法似乎证实了这一点:

my $string = '5+8i';
my $number = <<$string >>[0];  # note space before >>
say $number;

为了满足你的强迫症,你可能还需要在$string之前加一个空格。

是的,在Perl 6中,空格并没有意义。

答案 1 :(得分:7)

Jonathan回答RT #131695答案。

>>[]是一个postfix operator索引列表,所以它会尝试使用它。这是预期的行为。很公平,虽然我认为解析器对于常规代码猴来说太聪明了。