Por que Duration.new funciona com Int, mas não com Rat?

9

Por uma Duração, por que preciso coagir um Rato a um Real manualmente, mas não um Int?

Esta é a versão 2020.01 do Rakudo, criada no MoarVM versão 2020.01.1, implementando o Perl 6.d. No 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
p6steve
fonte

Respostas:

10

Isso é um bug. Que foi corrigido com https://github.com/rakudo/rakudo/commit/f70d95e299 .

A razão pela qual agiu de maneira diferente do Ratque para qualquer outro tipo, é que o Ratcaso foi otimizado para não ter que fazer coerção e, portanto, não é necessário verificar o resultado da coerção. Nesse caso, o valor foi colocado diretamente no novo Durationobjeto. No entanto, isso foi feito sem desmaterializar, para que o Durationobjeto realmente fizesse referência à variável $xdo seu exemplo. Tudo está bem em geral, mas a .gistlógica de alguma forma criou um loop infinito, tentando criar uma representação do Durationpor causa dessa auto-referência. Devo admitir que eu realmente não olhei exatamente onde ele entrou em loop.

De qualquer forma, ao garantir que o valor não seja mantido dentro do Durationobjeto, o problema desaparece, pois não pode mais ser auto-referenciado.

Elizabeth Mattijsen
fonte
11
aha - obrigado! Geralmente com o raku, acho que os bugs são meus e não o compilador!
p6steve 10/04
Pergunta auto-referencial!
SS Anne