为什么Perl 6的正确关联性不对?

时间:2018-01-12 04:57:00

标签: perl6 associativity raku

Clickbaity标题,但它太过肉了,不能放弃。我有这个操作符,我希望是正确的关联:

sub infix:<↑> ( Int:D \n, Int:D \m  --> Int:D )
    is assoc<right>
    is equiv(&infix:<**>)
    { n ** m }

put "2**2**2**2 = ",      2**2**2**2;
put "2↑2↑2↑2 = ",         2↑2↑2↑2;
put "2↑ (2↑ (2↑2) ) = ",  2↑ (2↑ (2↑2) );

这不是正确的联想:

2**2**2**2 = 65536
2↑2↑2↑2 = 256
2↑ (2↑ (2↑2) ) = 65536

我做得不对( ahem )?

1 个答案:

答案 0 :(得分:13)

看起来这里有一堆虫子......

首先,在这种特殊情况下不需要is assoc。作为is equiv copies all the options,不仅仅是优先级,&infix:<**>是右关联的。

它不起作用的原因是因为some guy broke it in Apr. 2017,删除assoc(基本上将其设置为左关联)。

我现在已经恢复了该提交,但in a branch因为还原练习RT#132711,这是assoc的原始删除尝试解决的问题。 我将在本周末修复该错误,然后合并is equiv的修复。 更新:它实际上在EXPR解析器中爆炸。我的rakudo haxor级别还不够高,无法处理那件事,所以我现在就把它留给更聪明的人。

P.S。:你可以通过将句子写为&[**]而不是&infix:<**>来保存一些字符