Raku의 Real — 실수로의 변환
Raku의 Real — 실수로의 변환
Raku에는 거의 모든 수치 타입이 공통으로 쓰는 Real 메서드가 있어요. "이 값을 실수(Real)로 바꾸면 어떤 값이 나오는가"를 물어볼 때 쓰는데, 타입마다 변환 방식과 반환형이 조금씩 달라요. 그래서 이 문서에서는 Real 메서드가 타입별로 어떻게 동작하는지를 하나씩 살펴볼게요.
DateTime에서
multi method Real(DateTime:D: --> Instant:D)
호출자를 Instant로 변환합니다. Instant 메서드를 써도 같은 값을 얻을 수 있어요. 이 변형은 Rakudo 컴파일러 2023.02 릴리스부터 사용할 수 있어요.
IntStr에서
multi method Real(IntStr:D: --> Int:D)
multi method Real(IntStr:U: --> Int:D)
:D 변형은 호출자의 수치 부분을 반환합니다. :U 변형은 초기화되지 않은 값을 수치 문맥에서 사용한다는 경고를 내고 값 0을 반환해요.
Cool에서
multi method Real()
호출자를 Numeric으로 강제 변환하고, 그것의 .Real 메서드를 호출합니다. Numeric으로의 변환이 불가능하면 실패(fail)해요.
say 1+0i.Real; # OUTPUT: «1»
say 2e1.Real; # OUTPUT: «20»
say 1.3.Real; # OUTPUT: «1.3»
say (-4/3).Real; # OUTPUT: «-1.333333»
say "foo".Real.^name; # OUTPUT: «Failure»
복소수 1+0i, 지수 2e1, 소수 1.3, 분수 -4/3은 각각 실수로 잘 변환돼요. 그런데 실수로 바꿀 수 없는 문자열 "foo"는 변환이 실패해서 Failure가 반환되는 걸 볼 수 있어요.
RatStr에서
multi method Real(Real:D: --> Rat:D)
multi method Real(Real:U: --> Rat:D)
:D 변형은 호출자의 수치 부분을 반환하고, :U 변형은 초기화되지 않은 값을 수치 문맥에서 사용한다는 경고를 낸 뒤 값 0.0을 반환합니다.
Date에서
multi method Real(Date:D: --> Int:D)
호출자를 Int로 변환합니다. daycount 메서드로도 같은 값을 얻을 수 있어요. 이 변형도 Rakudo 2023.02 릴리스부터 쓸 수 있어요.
NumStr에서
multi method Real(NumStr:D: --> Num:D)
multi method Real(NumStr:U: --> Num:D)
:D 변형은 호출자의 수치 부분을 반환하고, :U 변형은 경고를 낸 뒤 값 0e0을 반환합니다.
role Enumeration에서
multi method Real(::?CLASS:D:)
열거형(enum)의 값을 하나 받아 Real로 강제 변환한 뒤 반환합니다.
enum Numbers ( cool => '42', almost-pi => '3.14', sqrt-n-one => 'i' );
say cool.Real; # OUTPUT: «42»
say almost-pi.Real; # OUTPUT: «3.14»
try say sqrt-n-one.Real;
say $!.message if $!; # OUTPUT: «Cannot convert 0+1i to Real: imaginary part not zero»
cool과 almost-pi는 각각 42, 3.14로 잘 변환돼요. 그런데 'i'처럼 실수로 바꿀 수 없는 값은 변환에 실패해서 예외가 발생합니다. try로 감쌌기 때문에 그 예외가 $!에 담겨 메시지로 출력되는 거예요. 값이 Real로 변환될 수 없으면 예외가 던져진다는 점을 기억하면 됩니다.
Complex에서
multi method Real(Complex:D: --> Num:D)
multi method Real(Complex:U: --> Num:D)
호출자를 Num으로 변환합니다. 허수부가 대략 0(≈)이 아니면 X::Numeric::Real로 변환이 실패해요. :D 변형은 그 변환 결과를 반환하고, :U 변형은 경고를 낸 뒤 0e0을 반환합니다.
ComplexStr에서
multi method Real(ComplexStr:D: --> Num:D)
multi method Real(ComplexStr:U: --> Num:D)
호출자의 수치 부분을 Num으로 변환합니다. 허수부가 대략 0(≈)이 아니면 X::Numeric::Real로 실패해요. :D 변형은 변환 결과를, :U 변형은 경고 후 0e0을 반환합니다.
role Real에서
multi method Real(Real:D: --> Real:D)
multi method Real(Real:U: --> Real:D)
:D 변형은 호출자를 그대로 반환합니다. 이미 실수이니 별도 변환이 필요 없는 거죠. :U 변형은 경고를 낸 뒤 self.new를 반환합니다.