Raku의 term:<> — 일반 식별자 규칙을 벗어나는 새 term 만들기
Raku의 term:<> — 일반 식별자 규칙을 벗어나는 새 term 만들기
보통 함수나 상수 이름은 식별자 규칙을 따라야 해요. 그런데 이모지 같은 규칙 밖의 문자를 그대로 'term'(값으로 쓰이는 이름)으로 쓰고 싶을 때가 있죠. Raku의 term:<>는 그런 새 term을 도입할 때 쓰는 구문이에요.
use Test; plan 1; constant &term:<👍> = &ok.assuming(True);
👍
# OUTPUT: «1..1ok 1 - »
위처럼 이모지 👍를 term으로 등록해 쓰는 게 가능해요. 그런데 term이 반드시 상수여야 하는 건 아니에요. 인자를 받지 않는 함수를 등록해서, 파서가 그 뒤에 반드시 연산자가 온다고 기대하게 만들 수도 있어요. 예시를 볼게요.
sub term:<dice> { (1..6).pick };
say dice + dice;
이 코드는 2와 12 사이의 어떤 숫자든 출력할 수 있어요.
만약 dice를 보통 함수로 선언했다면 어떻게 됐을까요?
sub dice() {(1...6).pick }
이 경우 dice + dice는 dice(+(dice()))로 파싱돼요. 그런데 sub dice는 인자를 0개 받도록 선언됐으니 인자가 하나 붙은 호출은 오류가 나요. 바로 이 점이 term:<dice>를 쓰는 이유예요.
본문
term:<>로 일반 식별자 규칙을 벗어나는 상수를 등록할 수 있어요(예: 이모지 term).- 인자 없는 함수를 term으로 등록하면, 그 뒤에 연산자가 온다고 파서가 기대하게 돼요 — 일반 함수와는 파싱이 달라져요.
- 일반
sub dice() {...}로 선언하면dice + dice가 인자를 건네는 호출로 파싱돼서 오류가 나요. 이걸 피하려면 term으로 등록하는 거예요.