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 <[email protected]> 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)"';