raku 从末端做转子的更好方法是什么?

lis*_*tor 6 list rotor raku

如果列表末尾的数据更重要,并且我希望 :partial list 保留在列表的开头,同时保留初始顺序,我会这样做:

> my @a = (0,1,2,3,4,5,6,7,8,9);
[0 1 2 3 4 5 6 7 8 9]
> say @a.rotor(4, :partial)
((0 1 2 3) (4 5 6 7) (8 9)) # not what I want; important data at end gets cut off;
> say @a.reverse.rotor(4, :partial).reverse.map({$_.reverse});
((0 1) (2 3 4 5) (6 7 8 9)) # this is what I want
Run Code Online (Sandbox Code Playgroud)

有没有办法避免 3 个“反向”操作?是否可以添加 :fromEnd 副词?

che*_*nyf 6

my @a = (0,1,2,3,4,5,6,7,8,9);
my @b = @a.rotor(4, :partial)».elems.reverse;
say @a.rotor(|@b);
Run Code Online (Sandbox Code Playgroud)


wam*_*mba 6

你可以用@a.rotor(2,4,4)还是通用一点的@a.rotor(@a % 4,slip 4 xx *)。当然,你可以定义函数

multi batch ( $_, $n, :from-end($)! ) {
    .rotor: .elems % $n, slip $n xx *
}
say batch  ^10,  4,:from-end; #or even
say (^10).&batch(4):from-end;
Run Code Online (Sandbox Code Playgroud)