I was trying to construct a sequence of functions using the sequence
operator, and encountered some very puzzling behavior. I was able to
reduce it down to some very simple examples.
[1] > my @s = +*, -> &f { &f } ... *
[...]
[2] > @s[0]
Too few positionals passed; expected 1 argument but got 0
in block <unit> at <unknown file> line 1
I expected that this would create a lazy sequence where the first element
is the WhateverCode function +*, and the generator function -> &f { &f }
just returns the previous element unchanged. But it doesn't work that way.
Strangely, I can call any element of this sequence, even the first one that
I supplied explicitly and is somehow unprintable, with any arguments and
get a list of the arguments back:
[3] > @s[0](1, 'x', pi)
(1 x 3.141592653589793)
Here's another couple of odd cases:
[4] > (1, +*, 2, 3, 4 ... *)[^10]
(1 1 1 1 1 1 1 1 1 1)
My experience has led me to expect that the ... operator only uses the list
element immediately preceding it as a generator, so I can't explain this.
Similarly:
[5] > (1, * + 1, 0, 0, 0, * + 2 ... *)[^10]
(1 2 3 4 5 6 7 8 9 10)
It looks like maybe the ... operator looks at the list on its left-hand
side, uses the first callable element it finds as the generator, and
discards everything after that...? Is that the correct behavior? Is that
the *intended* behavior?
Oh, actually, I see that the operator doc page
<https://docs.raku.org/language/operators> says that "Custom generators
need to be the last element of the list before the '...' operator." So, I
guess this is a bug...?
This is all in Rakudo 2023.06.