¿Por qué los bloques predeterminados Raku if / while / loop / when tienen el mismo valor de identidad (.WHICH)?

9

Excepto por el bloque donde declaró una firma, todos los bloques tienen el mismo valor de identidad y afirman ser declarados en la línea 1, independientemente de dónde ocurran. ¿Alguien podría arrojar algo de luz sobre por qué este es el caso?

say 「Let's look at some blocks…」;

if True {
  &?BLOCK.say;
}

while True {
  &?BLOCK.say;
  last;
}

loop {
  &?BLOCK.say;
  last;
}

if True -> | {
  「I'm different!」.say;
  &?BLOCK.say;
}

when ?True {
  &?BLOCK.say;
}
Daniel Mita
fuente

Respuestas:

6

En primer lugar: .sayno no le dan el valor de identidad, ya que llama al .gistmétodo en la expresión dada. Para el valor de identidad, debe llamar al .WHICHmétodo. Afortunadamente, el Block.gistmétodo hace incluirá el valor de identidad en su stringification. Pero no se garantiza que sea el caso para todos los objetos.

Lo que ves allí es el optimizador estático en funcionamiento: como no sucede nada dentro del bloque, se puede descartar. En el caso en que es diferente (donde especificó una firma alternativa), es diferente. Si ejecuta este script con --optimize=0o --optimize=1, todos los bloques tendrán diferentes valores de identidad.

Supongo que podría llamarse un problema que mencionar &?BLOCKno impide que el optimizador estático aplaste el alcance. Por otro lado, también podría llamar a esto un caso de DIHWIDT (Doctor, duele cuando hago esto). Entonces no hagas eso entonces :-)

ACTUALIZACIÓN: es la firma diferente que marcó la diferencia. Daniel Mita ++

Elizabeth Mattijsen
fuente
2
Gracias por la información, aunque no estoy seguro de seguir el segundo párrafo. La creación de la cadena no es lo que hace la diferencia, es la firma del bloque que lo hace (tiene el mismo valor de identidad si elimino la firma pero mantengo la cadena).
Daniel Mita