Raku의 abs — 절댓값 구하기

Raku의 abs — 절댓값 구하기

어떤 수의 부호를 떼고 크기만 필요할 때가 있죠. abs는 그런 일을 하는 루틴으로, 호출자(또는 서브 형태에서는 인자)를 Numeric으로 강제 변환한 뒤 절댓값(음이 아닌 수)을 돌려줘요. 아주 기본적인 수학 루틴이라 여러 타입·역할에 걸쳐 정의돼 있는데 하나씩 볼게요.

출처: Raku 공식 문서 — routine abs

Cool에서

Cool 계층에서는 인자를 Numeric으로 강제 변환하고 절댓값을 구합니다. 서브 형태는 Numeric() $x처럼 받아서 처리하죠.

sub abs(Numeric() $x)
method abs()
say (-2).abs;       # OUTPUT: «2␤»
say abs "6+8i";     # OUTPUT: «10␤»

"6+8i"는 문자열이지만 Numeric으로 강제 변환되면서 복소수 6+8i로 해석되고, 그 크기가 10으로 나오는 걸 볼 수 있어요.

role Numeric에서

Numeric 역할 쪽에서는 방향성(defined)이 보장된 형태로 정의돼 있어요.

multi        abs(Numeric:D  --> Real:D)
multi method abs(Numeric:D: --> Real:D)

숫자의 절댓값을 반환합니다.

Complex에서

Complex에서는 절댓값이 곧 복소수의 크기예요. 주어진 복소수 $z에 대해 |$z|sqrt($z.re * $z.re + $z.im * $z.im)으로 정의돼요.

method abs(Complex:D: --> Num:D)
multi  abs(Complex:D $z --> Num:D)
say (3+4i).abs;                 # OUTPUT: «5␤»
                                # sqrt(3*3 + 4*4) == 5

3+4i의 크기가 sqrt(9+16), 즉 5로 나오는 걸 확인할 수 있어요.