> On Jun 29, 2023, at 12:21, Sean McAfee <eef...@gmail.com> wrote: > > 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. >
Hi Sean, Well, I get your first example to work if I use the "." dot between @s and [0], as in "@s.[0]". By "work" I mean it doesn't error-out, returning (Any) instead. See: ~ % raku Welcome to Rakudo™ v2023.05. Implementing the Raku® Programming Language v6.d. Built on MoarVM version 2023.05. To exit type 'exit' or '^D' [0] > my @s = +*, -> &f { &f } ... * [...] [1] > @s[0] Too few positionals passed; expected 1 argument but got 0 in block <unit> at <unknown file> line 1 [1] > @s.[0] (Any) [2] > @s[0](1, 'x', pi) (1 x 3.141592653589793) HTH, Bill.