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

→‎{{header|Raku}}: DRY, pass operations as strings which requires EVAL and precludes sigiless variables
(→‎{{header|Raku}}: Add another parenthesis grouping)
(→‎{{header|Raku}}: DRY, pass operations as strings which requires EVAL and precludes sigiless variables)
Line 91:
* <code>-x{exponential operator}p</code>
* <code>-(x){exponential operator}p</code>
* <code>((-x){exponential operator}p)</code>
* <code>-(x{exponential operator}p)</code>
Also add a different grouping: <code>(1 + -x){exponential operator}p</code>
 
<lang perl6>saysub 'Default precedenceinfix: infix exponentiation<↑> is tighter looser(higher&prefix:<->) precedence{ $^a than** unary$^b negation.';}
sub infix-exp:<^> (\x,is \plooser(&infix:<->) { $^a ** $^b }
printf "x = %2d p = %d │ %s = %4d │ %s = %4d │ %s = %4d │ %s = %4d │ %s = %4d\n", x, p,
'1 + -x**p', 1 + -x**p, '1 + -(x)**p', 1 + -(x)**p, '1 + (-x)**p', 1 + (-x)**p, '(1 + -x)**p', (1 + -x)**p, '1 + -(x**p)', 1 + -(x**p);
}
 
use MONKEY;
-> $x, $p { infix-exp($x, $p) } for -5, 2, -5, 3, 5, 2, 5, 3;
 
sayfor "\nEven'Default moresoprecedence: custom looser infix exponentiation is loosertighter (lowerhigher) precedence than infixunary subtractionnegation.";',
('1 + -$x**$p', 1 + -x**p, '1 + -(-$x)**$p', '1 + (-($x)**$p, '1 + (-x)**p', 1 + (-x)**p, '(1 + -$x)**$p', (1 + -x)**p, '1 + -($x**$p)'), 1 + -(x**p);
 
say "\nEasily modified: custom loose infix exponentiation is looser (lower) precedence than unary negation.";,
('1 + -x^$x↑$p ', 1 + -x^p, '1 + (-($x)^↑$p ', '1 + (-($x)^↑$p, '1 + (-x)^p ', 1 + (-x)^p, '(1 + -$x)^↑$p ', (1 + -x)^p, '1 + -(x^$x↑$p) '), 1 + -(x^p);
sub infix:<↑> is looser(&prefix:<->) { $^a ** $^b }
 
"\nEven moreso: custom looser infix exponentiation is looser (lower) precedence than infix subtraction.",
sub infix-loose-exp (\x, \p) {
('1 + -$x^$p ', '1 + (-$x)^$p ', '1 + (-($x)^$p) ', '(1 + -$x)^$p ', '1 + -($x^$p) ')
printf "x = %2d p = %d │ %s = %4d │ %s = %4d │ %s = %4d │ %s = %4d │ %s = %4d\n", x, p,
-> $message, $ops {
'1 + -x↑p ', 1 + -x↑p, '1 + -(x)↑p ', 1 + -(x)↑p, '1 + (-x)↑p ', 1 + (-x)↑p, '(1 + -x)↑p ', (1 + -x)↑p, '1 + -(x↑p) ', 1 + -(x↑p);
say $message;
}
-> $x, $p { infix-exp($x, $p) } for -5, 2, -5, 3, 5, 2, 5, 3; -> $x, $p {
 
-> $x, $p { infix-loose-exp($x, $p) } for -5,printf 2,"x -5,= 3,%2d 5, 2p = %d", 5$x, 3$p;
-> $op { printf " │ %s = %4d", $op, EVAL $op } for |$ops;
 
print "\n";
 
}
say "\nEven moreso: custom looser infix exponentiation is looser (lower) precedence than infix subtraction.";
}</lang>
sub infix:<^> is looser(&infix:<->) { $^a ** $^b }
 
sub infix-looser-exp (\x, \p) {
printf "x = %2d p = %d │ %s = %4d │ %s = %4d │ %s = %4d │ %s = %4d │ %s = %4d\n", x, p,
'1 + -x^p ', 1 + -x^p, '1 + -(x)^p ', 1 + -(x)^p, '1 + (-x)^p ', 1 + (-x)^p, '(1 + -x)^p ', (1 + -x)^p, '1 + -(x^p) ', 1 + -(x^p);
}
 
-> $x, $p { infix-looser-exp($x, $p) } for -5, 2, -5, 3, 5, 2, 5, 3;</lang>
{{out}}
<pre>Default precedence: infix exponentiation is tighter (higher) precedence than unary negation.
x = -5 p = 2 │ 1 + -$x**$p = -24 │ 1 + -(-$x)**$p = -24 26 │ 1 + (-($x)**$p) = 26-24 │ (1 + -$x)**$p = 36 │ 1 + -($x**$p) = -24
x = -5 p = 3 │ 1 + -$x**$p = 126 │ 1 + -(-$x)**$p = 126 │ 1 + (-($x)**$p) = 126 │ (1 + -$x)**$p = 216 │ 1 + -($x**$p) = 126
x = 5 p = 2 │ 1 + -$x**$p = -24 │ 1 + -(-$x)**$p = -24 26 │ 1 + (-($x)**$p) = 26-24 │ (1 + -$x)**$p = 16 │ 1 + -($x**$p) = -24
x = 5 p = 3 │ 1 + -$x**$p = -124 │ 1 + -(-$x)**$p = -124 │ 1 + (-($x)**$p) = -124 │ (1 + -$x)**$p = -64 │ 1 + -($x**$p) = -124
 
Easily modified: custom loose infix exponentiation is looser (lower) precedence than unary negation.
x = -5 p = 2 │ 1 + -x↑p$x↑$p = 26 │ 1 + -(-$x)↑p↑$p = 26 │ 1 + (-($x)↑p↑$p) = 26 │ (1 + -$x)↑p↑$p = 36 │ 1 + -(x↑p$x↑$p) = -24
x = -5 p = 3 │ 1 + -x↑p$x↑$p = 126 │ 1 + -(-$x)↑p↑$p = 126 │ 1 + (-($x)↑p↑$p) = 126 │ (1 + -$x)↑p↑$p = 216 │ 1 + -(x↑p$x↑$p) = 126
x = 5 p = 2 │ 1 + -x↑p$x↑$p = 26 │ 1 + -(-$x)↑p↑$p = 26 │ 1 + (-($x)↑p↑$p) = 26 │ (1 + -$x)↑p↑$p = 16 │ 1 + -(x↑p$x↑$p) = -24
x = 5 p = 3 │ 1 + -x↑p$x↑$p = -124 │ 1 + -(-$x)↑p↑$p = -124 │ 1 + (-($x)↑p↑$p) = -124 │ (1 + -$x)↑p↑$p = -64 │ 1 + -(x↑p$x↑$p) = -124
 
Even moreso: 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) = 3626 │ (1 + -$x)^$p = 36 │ 1 + -($x^$p) = -24
x = -5 p = 3 │ 1 + -$x^$p = 216 │ 1 + -(-$x)^$p = 216 │ 1 + (-($x)^$p) = 216126 │ (1 + -$x)^$p = 216 │ 1 + -($x^$p) = 126
x = 5 p = 2 │ 1 + -$x^$p = 16 │ 1 + -(-$x)^$p = 16 │ 1 + (-($x)^$p) = 1626 │ (1 + -$x)^$p = 16 │ 1 + -($x^$p) = -24
x = 5 p = 3 │ 1 + -$x^$p = -64 │ 1 + -(-$x)^$p = -64 │ 1 + (-($x)^$p) = -64124 │ (1 + -$x)^$p = -64 │ 1 + -($x^$p) = -124</pre>
 
=={{header|REXX}}==
10,343

edits