Почему Perl 6 правильная ассоциативность неправа?

Название 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

Что я не делаю правильно (гм)?

Ответы

Ответ 1

Похоже, здесь есть баги ошибок...

Во-первых, is assoc в этом конкретном случае не нужен. Как is equiv копирует все параметры, а не только приоритет, а &infix:<**> является право-ассоциативным.

Причина, по которой он не работает, заключается в том, что какой-то парень сломал его в апреле 2017 года, assoc (по существу, установив его влево-ассоциировать).

Теперь я вернул эту фиксацию, но в ветке, потому что возвращаем упражнения RT # 132711, что и пыталось исправить первоначальное удаление assoc. Я дам вам возможность исправить эту ошибку в эти выходные, а затем объединить исправление для is equiv. UPDATE: он фактически взрывается в синтаксическом анализаторе EXPR. Мой уровень rakudo haxor недостаточно высок, чтобы работать на эту вещь, поэтому я оставлю его кому-то умнее.

PS: вы можете сохранить несколько символов, написав &infix:<**> как &[**] вместо &infix:<**>