Ralph, the last value in all functions are not sunk by default, so of course the last one in `TWEAK` is not sunk by default. This is intended behaviour.
It is up to the code that calls a function to sink the result if that is the desired behaviour. sub foo { 'a b c'.words».uc.map: *.say; } my $ = foo(); # nothing is printed sink foo(); # «ABC» is printed The bug is that the calling code is not sinking the result. On Sat, Mar 13, 2021 at 8:05 PM Ralph Mellor <ralphdjmel...@gmail.com> wrote: > Here's a golf: > > class { submethod TWEAK { Any.map: {say 99} } }.new; # > class { submethod TWEAK { Any.map: {say 99}; 42 } }.new; # 99 > class { submethod TWEAK (--> 42) { Any.map: {say 99} } }.new; # 99 > > The last line in a `BUILD` or `TWEAK` submethod is not eagerly evaluated > by default. > > That sounds like a bug to me. But if not, and in the meantime, > because your `$!filelist.lines...` line is the last one in your `TWEAK` > submethod, the `@!show` array is being left empty, so the value to > the right of `%` evaluates to zero, hence the error message you're seeing. > > On Sat, Mar 13, 2021 at 8:30 PM <mimosin...@gmail.com> wrote: > > > > Hi, > > > > When working with this week challenge for the PerlWeeklyChallenge, I > noticed this behaviour with TWEAK: > > > > This does not work: > > submethod TWEAK { > > $!filelist.lines».split(',').map( -> ($a, $b) { @!show.push: ( $a, > $b ) }); > > } > > > > This works: > > submethod TWEAK { > > $!filelist.lines».split(',').map( -> ($a, $b) { @!show.push: ( $a, > $b ) }); > > return; > > } > > > > It also works with other commands instead of 'return' (like assigning a > value to a variable). From the examples in the documentation, I am not > certain this is the expected behaviour. > > > > Thanks for this extraordinary language, > > > > Joan > > > > > > P.S: This is the context where the command appears. Apologies for the > messy-Raku, > > ------------------------------ > > use Test; > > > > my $data = '1709363,"Les Miserables Episode 1: The Bishop (broadcast > date: 1937-07-23)" > > 1723781,"Les Miserables Episode 2: Javert (broadcast date: 1937-07-30)" > > 1723781,"Les Miserables Episode 3: The Trial (broadcast date: > 1937-08-06)" > > 1678356,"Les Miserables Episode 4: Cosette (broadcast date: 1937-08-13)" > > 1646043,"Les Miserables Episode 5: The Grave (broadcast date: > 1937-08-20)" > > 1714640,"Les Miserables Episode 6: The Barricade (broadcast date: > 1937-08-27)" > > 1714640,"Les Miserables Episode 7: Conclusion (broadcast date: > 1937-09-03)"'; > > > > class Movies { > > > > has $.starttime; > > has $.currenttime; > > has $.filelist; > > has @!show; # ( [ time, show ] ) > > > > submethod TWEAK { > > # miliseconds -> seconds > > $!filelist.lines».split(',').map( -> ($a, $b) { @!show.push: ( $a, > $b ) }); > > return; > > } > > > > method what-show() { > > my $position = ( $!currenttime - $!starttime ) % > @!show[*;0].sum/1000; > > my ($time, $show); > > for @!show[*;0] -> $show-time { > > $time += $show-time; > > return @!show[$show++;1] if $time > $position; > > } > > } > > } > > > > my $mv = Movies.new( > > starttime => '1606134123', > > currenttime => '1614591276', > > filelist => $data > > ); > > > > is $mv.what-show, '"Les Miserables Episode 1: The Bishop (broadcast > date: 1937-07-23)"'; >