sub cross (*$f, *@a) { return unless $f; @a or return @{$f}.map:{[$_]} ; # Handle one argument. my @r = cross(@a); # Recurse. @$f.map:{my $l = $_ ; @r.map:{[$l, @$_]} }; # Distribute. } cross().perl.say; cross([],[1]).perl.say; cross([1,2]).perl.say; cross([1,2],[3]).perl.say; cross([1],[2],[3]).perl.say; cross([1],[2],[3,4]).perl.say;