Perché il Raku predefinito if / while / loop / when blocchi hanno tutti lo stesso valore di identità (.WHICH)?


9

Ad eccezione del blocco in cui ho dichiarato una firma, tutti i blocchi hanno lo stesso valore di identità e dichiarano di essere dichiarati sulla riga 1 indipendentemente da dove si verificano. Qualcuno potrebbe far luce sul perché questo è il 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;
}

Risposte:


6

Prima di tutto: .saynon non ti danno il valore di identità, perché che chiama il .gistmetodo sul espressione data. Per il valore dell'identità, è necessario chiamare il .WHICHmetodo Fortunatamente, il Block.gistmetodo di non includere il valore di identità nella sua in stringa. Ma questo non è garantito per tutti gli oggetti.

Quello che vedi lì è l'ottimizzatore statico al lavoro: poiché non sta succedendo nulla all'interno del blocco, può essere scartato. Nel primo caso in cui è diverso (dove è stata specificata una firma alternativa), è diverso. Se si esegue questo script con --optimize=0o --optimize=1, tutti i blocchi avranno valori di identità diversi.

Immagino che potresti chiamarlo un problema che menzionare &?BLOCKnon impedisce all'ottimizzatore statico di appiattire l'ambito. D'altra parte, potresti anche chiamare questo un caso di DIHWIDT (Dottore, Fa male quando lo faccio). Quindi non farlo allora :-)

AGGIORNAMENTO: sono state le diverse firme a fare la differenza. Daniel Mita ++


2
Grazie per le informazioni, anche se non sono sicuro di seguire il secondo paragrafo. La creazione della stringa non è ciò che fa la differenza, è la firma per il blocco che ha (ha lo stesso valore di identità se rimuovo la firma ma mantengo la stringa).
Daniel Mita,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.