HyperWhatever — 여러 개의 미지정 값·인자를 대신하는 자리
HyperWhatever — 여러 개의 미지정 값·인자를 대신하는 자리
값을 하나만 대신하는 Whatever가 있다면, 여러 개의 값을 대신하는 자리도 있으면 좋겠죠. HyperWhatever가 바로 그 역할을 해요. 기능적으로는 Whatever와 매우 유사하지만, 단일 값이 아니라 여러 값을 대신한다는 점이 다르답니다.
본문
단독 용어 (Standalone term)
Whatever와 마찬가지로, HyperWhatever가 단독으로 용어(term)로 쓰이면 프라이밍(priming)이 일어나지 않고 그 객체 자체가 그대로 사용돼요.
sub foo ($arg) { say $arg.^name }
foo **; # OUTPUT: «HyperWhatever»
자신이 만든 루틴에서는 그런 값을 '여러 값을 대신하는 것'으로 해석하도록 정할 수 있어요. 코어에서는 이 의미로 HyperWhatever를 List와 스마트매치할 때 쓸 수 있어요.
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)
프라이밍과 관련해서 HyperWhatever는 Whatever와 같은 규칙을 따라요. 유일한 차이는 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)»
프라이밍 시 HyperWhatever를 Whatever와 섞어 쓰는 것은 허용되지 않아요.