왜 Duration.new가 Int에서 작동하지만 Rat에서는 작동하지 않습니까?


9

지속 시간 동안 왜 쥐를 Real로 손으로 강제해야하지만 Int는 그렇지 않습니까?

Perl 6.d를 구현하는 MoarVM 버전 2020.01.1을 기반으로하는 Rakudo 버전 2020.01입니다. OSX에서.

say $v.WHAT; #(Int)
$v = Duration.new( $v );
say $v;     #20 

my $w = 20.0;
say $w.WHAT; #(Rat)
$w = Duration.new( $w.Real );
say $w;     #20 

my $x = 20.0;
say $x.WHAT; #(Rat)
$x = Duration.new( $x );
say $x;     #hangs

답변:


10

이것은 버그입니다. https://github.com/rakudo/rakudo/commit/f70d95e299 로 수정되었습니다 .

그것이 Rat다른 유형과 다르게 행동하는 이유 는 Rat, 강요가 필요하지 않도록 최적화되어 강압 결과를 확인할 필요가 없기 때문입니다. 이 경우 값은 새 Duration객체 에 직접 입력되었습니다 . 그러나 컨테이너를 분리하지 않고 그렇게 했으므로 Duration객체는 실제로 $x예제 에서 변수 를 참조합니다 . 이것은 일반적으로 괜찮지 만 .gist논리는 어떻게 든 Duration이 자체 참조로 인해 표현을 만들려고 무한 루프를 만들었습니다 . 루프가 정확히 어디로 들어가는 지 실제로 조사하지 않았다는 것을 인정해야합니다.

어쨌든, Duration개체 내부에서 값이 컨테이너 해제되도록 함으로써 문제는 사라지고 더 이상 자기 참조 할 수 없게됩니다.


1
아하-고마워! 보통 raku를 사용하면 버그가 컴파일러가 아니라 내 버그라는 것을 알 수 있습니다!
p6steve

자기 참조 질문!
SS Anne
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.