use Something;
sub infix:<%%%>(*@args) is assoc("list") { [*] @args }
say 9 %%% 10;
say 9 %%% 10 %%% -44;
i want to change it so that this compiles to 28 %%% 5
for first and 28 %%% 5 %%% -22
for second because if operand is odd, it is 3*$_+1 instead. if operand is even number, it is halved instead. What should I do in use Something
to make this work
TL;DR Riddle. When is half an answer already an answer? Answer: when you double it by doing nothing. Ain't that Something?
Something
sub infix:<%%%>(*@args) is assoc("list") { [*] @args }
say 9 %%% 10; # 90
say 9 %%% 10 %%% -44; # -3960
The goal is to introduce Something
such that the output for the above (90
and -3960
) change to be output below (140
and -3080
):
say 28 %%% 5; # 140
say 28 %%% 5 %%% -22; # -3080
We don't care about that second example from here on, just getting those two numbers output for the first example.
Introduce a custom infix *
and make it oddeven
its arguments. Stick it at the top of the file to test (we can pop it in module later):
# use Something;
sub oddeven ($_) { $_ %% 2 ?? $_/2 !! &CORE::infix:<*>(3,$_) + 1 }
sub infix:<*>(*@args) is assoc<right> { &CORE::infix:<*>( |@args>>.&oddeven ) }
# Your original code:
sub infix:<%%%>(*@args) is assoc("list") { [*] @args }
say 9 %%% 10; # 140
say 9 %%% 10 %%% -44; # -1540
The -1540
is half what it should be. &oddeven
is obviously being eval'd twice on the middle argument. Hmm.
Introduce a noop
role (trait) and use appropriately:
role noop {}
multi oddeven (noop $_) { $_ }
multi oddeven ( $_) { $_ %% 2 ?? $_/2 !! &CORE::infix:<*>(3,$_) + 1 }
sub infix:<*>(*@args) is assoc<right> { &CORE::infix:<*>( |@args>>.&oddeven ) but noop }
sub infix:<%%%>(*@args) is assoc("list") { [*] @args }
say 9 %%% 10; # 140
say 9 %%% 10 %%% -44; # -3080
Declare a noop
role that does... nothing.
Split oddeven
to do nothing with a noop
argument.
Add a noop
tag to the value calculated by my custom infix *
so oddeven
would leave it alone when it gets called on that value a second time, as happens in a chained expression (the value that starts out as 10
in 9 %%% 10 %%% -22
).
I'll leave popping it into a module as an exercise for the reader.
That depends on the nature of the X in what is presumably an XY problem. I deliberately chose not to explore what you were really after (X
), and instead focused on problem Y
, the one you literally asked.
I've come up with an answer, but, but ... but
. Also, I'm tired, so I haven't explained some of the code that maybe needs an explanation. So maybe this isn't yet an acceptable answer. If not, let's talk, but it won't be tonight.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With