¿Por qué Duration.new funciona con Int pero no con Rat?


9

Por una duración, ¿por qué necesito obligar a una rata a un real a mano, pero no a un int?

Esta es Rakudo versión 2020.01 construida en MoarVM versión 2020.01.1 que implementa Perl 6.d. En 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

Respuestas:


10

Esto es un error Que se ha solucionado con https://github.com/rakudo/rakudo/commit/f70d95e299 .

La razón por la que actuó de manera diferente Ratque para cualquier otro tipo, es que el Ratcaso fue optimizado para no tener que hacer ninguna coerción, y por lo tanto no fue necesario verificar el resultado de la coerción. En ese caso, el valor se colocó directamente en el nuevo Durationobjeto. Sin embargo, lo hizo sin desempaquetar, por lo que el Durationobjeto realmente estaría haciendo referencia a la variable $xde su ejemplo. En general, todo está bien, pero la .gistlógica de alguna manera creó un bucle infinito tratando de crear una representación del Durationdebido a esta autorreferencia. Debo admitir que realmente no investigé dónde exactamente se metió en un bucle.

De todos modos, al asegurarse de que el valor se descontamine dentro del Durationobjeto, el problema desaparece, ya que ya no se puede hacer referencia a sí mismo.


1
aha - gracias! Por lo general, con raku encuentro que los errores son míos y no del compilador.
p6steve

¡Pregunta autorreferencial!
SS Anne
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.