Exponentiation with infix operators in (or operating on) the base: Difference between revisions

Content added Content deleted
(added langur language example)
(→‎{{header|Raku}}: re-write without EVAL, works in recent releases of Raku)
Line 768: Line 768:
sub infix:<∧> is looser(&infix:<->) { $^a ** $^b }
sub infix:<∧> is looser(&infix:<->) { $^a ** $^b }


for
use MONKEY;
('Default precedence: infix exponentiation is tighter (higher) precedence than unary negation.',
'1 + -$x**$p', {1 + -$^a**$^b}, '1 + (-$x)**$p', {1 + (-$^a)**$^b}, '1 + (-($x)**$p)', {1 + (-($^a)**$^b)},
'(1 + -$x)**$p', {(1 + -$^a)**$^b}, '1 + -($x**$p)', {1 + -($^a**$^b)}),


for 'Default precedence: infix exponentiation is tighter (higher) precedence than unary negation.',
("\nEasily modified: custom loose infix exponentiation is looser (lower) precedence than unary negation.",
('1 + -$x**$p', '1 + (-$x)**$p', '1 + (-($x)**$p)', '(1 + -$x)**$p', '1 + -($x**$p)'),
'1 + -$x↑$p ', {1 + -$^a↑$^b}, '1 + (-$x)$p ', {1 + (-$^a)$^b}, '1 + (-($x)$p) ', {1 + (-($^a)↑$^b)},
'(1 + -$x)↑$p ', {(1 + -$^a)↑$^b}, '1 + -($x↑$p) ', {1 + -($^a↑$^b)}),


"\nEasily modified: custom loose infix exponentiation is looser (lower) precedence than unary negation.",
("\nEven more so: custom looser infix exponentiation is looser (lower) precedence than infix subtraction.",
('1 + -$x↑$p ', '1 + (-$x)$p ', '1 + (-($x)$p) ', '(1 + -$x)$p ', '1 + -($x↑$p) '),
'1 + -$x∧$p ', {1 + -$^a∧$^b}, '1 + (-$x)$p ', {1 + (-$^a)$^b}, '1 + (-($x)$p) ', {1 + (-($^a)∧$^b)},
'(1 + -$x)∧$p ', {(1 + -$^a)∧$^b}, '1 + -($x∧$p) ', {1 + -($^a∧$^b)})

-> $case {
"\nEven moreso: custom looser infix exponentiation is looser (lower) precedence than infix subtraction.",
my ($title, @operations) = $case<>;
('1 + -$x∧$p ', '1 + (-$x)$p ', '1 + (-($x)$p) ', '(1 + -$x)$p ', '1 + -($x∧$p) ')
-> $message, $ops {
say $title;
say $message;
for -5, 5 X 2, 3 -> ($x, $p) {
for -5, 5 X 2, 3 -> ($x, $p) {
printf "x = %2d p = %d", $x, $p;
printf "x = %2d p = %d", $x, $p;
-> $op { printf " │ %s = %4d", $op, EVAL $op } for |$ops;
for @operations -> $label, &code { print " │ $label = " ~ $x.&code($p).fmt('%4d') }
print "\n";
say ''
}
}
}</syntaxhighlight>
}</syntaxhighlight>
Line 799: Line 802:
x = 5 p = 3 │ 1 + -$x↑$p = -124 │ 1 + (-$x)↑$p = -124 │ 1 + (-($x)↑$p) = -124 │ (1 + -$x)↑$p = -64 │ 1 + -($x↑$p) = -124
x = 5 p = 3 │ 1 + -$x↑$p = -124 │ 1 + (-$x)↑$p = -124 │ 1 + (-($x)↑$p) = -124 │ (1 + -$x)↑$p = -64 │ 1 + -($x↑$p) = -124


Even moreso: custom looser infix exponentiation is looser (lower) precedence than infix subtraction.
Even more so: custom looser infix exponentiation is looser (lower) precedence than infix subtraction.
x = -5 p = 2 │ 1 + -$x∧$p = 36 │ 1 + (-$x)∧$p = 36 │ 1 + (-($x)∧$p) = 26 │ (1 + -$x)∧$p = 36 │ 1 + -($x∧$p) = -24
x = -5 p = 2 │ 1 + -$x∧$p = 36 │ 1 + (-$x)∧$p = 36 │ 1 + (-($x)∧$p) = 26 │ (1 + -$x)∧$p = 36 │ 1 + -($x∧$p) = -24
x = -5 p = 3 │ 1 + -$x∧$p = 216 │ 1 + (-$x)∧$p = 216 │ 1 + (-($x)∧$p) = 126 │ (1 + -$x)∧$p = 216 │ 1 + -($x∧$p) = 126
x = -5 p = 3 │ 1 + -$x∧$p = 216 │ 1 + (-$x)∧$p = 216 │ 1 + (-($x)∧$p) = 126 │ (1 + -$x)∧$p = 216 │ 1 + -($x∧$p) = 126