为什么 Perl 6 的右结合性不对?
Why is Perl 6's right associativity not right?
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
我哪里做错了(咳咳)?
看起来这里有很多错误...
首先,在这种特殊情况下不需要 is assoc
。如is equiv
copies all the options,不仅是优先级,而且&infix:<**>
是右结合的。
它不起作用的原因是 some guy broke it in Apr. 2017,通过删除 assoc
(实质上将其设置为左关联)。
我现在恢复了那个提交,但是 in a branch because the revert exercises RT#132711,这是最初删除 assoc
试图修复的问题。 本周末我将尝试修复该错误,然后合并 is equiv
的修复。 更新:它实际上在 EXPR 解析器中爆炸。我的 rakudo haxor 水平还不够高,无法处理那件事,所以我暂时将它留给更聪明的人。
P.S.: 你可以通过将中缀写成 &[**]
而不是 &infix:<**>
来节省几个字符
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
我哪里做错了(咳咳)?
看起来这里有很多错误...
首先,在这种特殊情况下不需要 is assoc
。如is equiv
copies all the options,不仅是优先级,而且&infix:<**>
是右结合的。
它不起作用的原因是 some guy broke it in Apr. 2017,通过删除 assoc
(实质上将其设置为左关联)。
我现在恢复了那个提交,但是 in a branch because the revert exercises RT#132711,这是最初删除 assoc
试图修复的问题。 本周末我将尝试修复该错误,然后合并 更新:它实际上在 EXPR 解析器中爆炸。我的 rakudo haxor 水平还不够高,无法处理那件事,所以我暂时将它留给更聪明的人。is equiv
的修复。
P.S.: 你可以通过将中缀写成 &[**]
而不是 &infix:<**>