HyperWhatever — 여러 개의 미지정 값·인자를 대신하는 자리

HyperWhatever — 여러 개의 미지정 값·인자를 대신하는 자리

값을 하나만 대신하는 Whatever가 있다면, 여러 개의 값을 대신하는 자리도 있으면 좋겠죠. HyperWhatever가 바로 그 역할을 해요. 기능적으로는 Whatever와 매우 유사하지만, 단일 값이 아니라 여러 값을 대신한다는 점이 다르답니다.

출처: Raku Documentation — HyperWhatever

본문

단독 용어 (Standalone term)

Whatever와 마찬가지로, HyperWhatever가 단독으로 용어(term)로 쓰이면 프라이밍(priming)이 일어나지 않고 그 객체 자체가 그대로 사용돼요.

sub foo ($arg) { say $arg.^name }
foo **; # OUTPUT: «HyperWhatever␤»

자신이 만든 루틴에서는 그런 값을 '여러 값을 대신하는 것'으로 해석하도록 정할 수 있어요. 코어에서는 이 의미로 HyperWhateverList와 스마트매치할 때 쓸 수 있어요.

say (1, 8)                ~~ (1, **, 8); # OUTPUT: «True␤»
say (1, 2, 4, 5, 6, 7, 8) ~~ (1, **, 8); # OUTPUT: «True␤»
say (1, 2, 8, 9)          ~~ (1, **, 8); # OUTPUT: «False␤»

스마트매치되는 목록의 오른쪽 목록에서 HyperWhatever가 등장한 위치에는, 곧 그 자리를 임의 개수의 요소가 채울 수 있다는 뜻이에요.

프라이밍 (Priming)

프라이밍과 관련해서 HyperWhateverWhatever와 같은 규칙을 따라요. 유일한 차이는 HyperWhatever가 시그니처로 *@ 슬러피(slurpy)를 가진 Callable을 만들어낸다는 점이에요.

say (**²)(1, 2, 3, 4, 5); # OUTPUT: «(1 4 9 16 25)␤»

HyperWhatever 클로저는 WhateverCode또 하나의 서브를 감싼 것이라 상상할 수 있어요. 그 서브는 단순히 인자들의 각 요소를 매핑하죠.

my &hyper-whatever = sub (*@args) { map *², @args }
say hyper-whatever(1, 2, 3, 4, 5); # OUTPUT: «(1 4 9 16 25)␤»

프라이밍 시 HyperWhateverWhatever와 섞어 쓰는 것은 허용되지 않아요.