Raku의 Z — 리스트를 지퍼처럼 엮는 zip 연산자

Raku의 Z — 리스트를 지퍼처럼 엮는 zip 연산자

두 리스트를 인덱스끼리 짝지어 묶고 싶을 때가 있어요. 첫 번째 원소끼리, 두 번째 원소끼리, 이런 식으로 말이죠. Raku의 Z(Zip) 연산자는 전달된 리스트들을 지퍼처럼 엮어요.

sub infix:<Z>(**@lists --> Seq:D) is assoc<list>

각 오퍼랜드에서 인덱스가 대응하는 원소를 하나씩 가져와 묶고, 그 결과를 담은 Seq를 돌려줘요. 각 묶음은 체인에 참여한 모든 오퍼랜드에서 하나씩 값을 받은 중첩 리스트예요. 오퍼랜드 중 하나가 먼저 요소를 다 쓰면 zip 연산은 거기서 멈춰요.

say (1, 2 Z <a b c> Z <+ ->).raku;
# OUTPUT: «((1, "a", "+"), (2, "b", "-")).Seq␤»
for <a b c> Z <1 2 3 4> -> [$l, $r] {
    say "$l:$r"
}
# OUTPUT: «a:1␤b:2␤c:3␤»

Z는 메타연산자로도 쓸 수 있어요. 그 경우 중첩 리스트 대신, 그 위치에 연산자를 적용한 값이 들어가요.

say 100, 200 Z+ 42, 23;             # OUTPUT: «(142 223)␤»
say 1..3 Z~ <a b c> Z~ 'x' xx 3;    # OUTPUT: «(1ax 2bx 3cx)␤»

infix:<Z>Z,의 단축형이에요. 즉 Z 메타연산자를 ,(리스트 생성 연산자)에 적용한 것과 같아요.

다른 중위 연산자처럼 전체 이름으로도 호출할 수 있어요.

say infix:<Z>(<a b>,<c d>);             # OUTPUT: «((a c) (b d))␤»

인자를 하나도 주지 않으면 빈 Seq를 돌려줘요.

say infix:<Z>();                        # OUTPUT: «()␤»

출처: Raku 공식 문서 — Z

본문

  • Z는 리스트들을 인덱스 기준으로 짝지어 중첩 리스트의 Seq를 만들어요. 짧은 쪽이 먼저 끝나면 거기서 멈춰요.
  • Z+, Z~처럼 메타연산자로 쓰면 묶음 대신 연산 결과가 들어가요.
  • 인자가 없으면 빈 Seq를 반환해요.