Pourquoi les blocs Raku par défaut if / while / loop / when ont-ils tous la même valeur d'identité (.WHICH)?

9

À l'exception du bloc où j'ai déclaré une signature, tous les blocs ont la même valeur d'identité et prétendent être déclarés sur la ligne 1, peu importe où ils se produisent. Quelqu'un pourrait-il nous expliquer pourquoi c'est le cas?

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
la source

Réponses:

6

Tout d'abord: .sayne vous donne PAS la valeur d'identité, car cela appelle la .gistméthode sur l'expression donnée. Pour la valeur d'identité, vous devez appeler la .WHICHméthode. Heureusement, la Block.gistméthode ne comprend la valeur d'identité dans sa mise en chaîne. Mais cela n'est pas garanti pour tous les objets.

Ce que vous voyez là, c'est l'optimiseur statique au travail: parce que rien ne se passe à l'intérieur du bloc, il peut être supprimé. Dans le cas où elle est différente (où vous avez spécifié une autre signature), elle est différente. Si vous exécutez ce script avec --optimize=0ou --optimize=1, tous les blocs auront des valeurs d'identité différentes.

Je suppose que vous pourriez appeler cela un problème que la mention &?BLOCKn'empêche pas l'optimiseur statique d'aplatir la portée. D'un autre côté, vous pourriez également appeler cela un cas de DIHWIDT (Docteur, ça fait mal quand je fais ça). Alors ne fais pas ça alors :-)

MISE À JOUR: c'est la signature différente qui a fait la différence. Daniel Mita ++

Elizabeth Mattijsen
la source
2
Merci pour l'info, bien que je ne sois pas sûr de suivre pour le 2ème paragraphe. La création de la chaîne n'est pas ce qui fait la différence, c'est la signature du bloc qui le fait (elle a la même valeur d'identité si je retire la signature mais garde la chaîne).
Daniel Mita