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.

Reply via email to