On Mon, 05 Oct 2015 09:10:42 -0700, [email protected] wrote:
> The following two expressions should give the same result:
>
> $ perl6 -e 'say ([o] (1 + 1/*), (2 + 1/*))(Inf);'
> 1.5
>
> $ perl6 -e 'say ([o] (++$ + 1/*) xx 2)(Inf);'
> 3
What's happening is that the `++$` operation isn't evaluated only once (when
the WhateverCode is constructed), but actually becomes part of the WhateverCode
and is evaluated each time the WhateverCode is called:
my &a = ++$ + *;
say a 0; # 1
say a 0; # 2
say a 0; # 3
That's nothing specific to `++` or `$`, e.g. consider:
my &a = rand + *;
say a 0; # 0.949744965798848
say a 0; # 0.842127241122708
say a 0; # 0.716049843395635
As jnthn explained on IRC:
<jnthn> Yeah, if the + is being whatever-curried then the
LHS is going to be pulled into the thunk as a whole
<jnthn> It's a compile-time transform
To create a different WhateverCode on each iteration as you intended, make it
close over the loop variable:
say ([o] do for 1..2 { $_ + 1/* })(Inf); # 1.5
TL;DR: Working as intended.
Closing this ticket.