Dlaczego domyślne bloki Raku, jeśli / while / loop / when mają wszystkie tę samą wartość tożsamości (.WHICH)?

9

Z wyjątkiem bloku, w którym zadeklarowałem podpis, wszystkie bloki mają tę samą wartość tożsamości i twierdzą, że zostały zadeklarowane w wierszu 1, niezależnie od tego, gdzie występują. Czy ktoś mógłby rzucić nieco światła na to, dlaczego tak jest?

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
źródło

Odpowiedzi:

6

Przede wszystkim: .sayczy NIE daje wartość tożsamości, ponieważ wywołuje .gistmetodę na danej wypowiedzi. Aby uzyskać wartość tożsamości, musisz wywołać .WHICHmetodę. Na szczęście, Block.gistmetoda nie obejmuje wartości tożsamości w jej stringification. Ale to nie gwarantuje to miejsce w przypadku wszystkich obiektów.

To, co tam widzisz, to statyczny optymalizator działający: ponieważ w bloku nic się nie dzieje, można go wyrzucić. W jednym przypadku, w którym jest inny (w którym podano alternatywny podpis), jest inaczej. Jeśli uruchomisz ten skrypt za pomocą --optimize=0lub --optimize=1, wówczas wszystkie bloki będą miały różne wartości tożsamości.

Wydaje mi się, że można nazwać to zagadnieniem, w którym wspomnienie &?BLOCKnie powstrzymuje statycznego optymalizatora przed spłaszczeniem lunety. Z drugiej strony możesz to nazwać przypadkiem DIHWIDT (Doctor, It Hurts When I Do This). Więc nie rób tego :-)

AKTUALIZACJA: to inny podpis, który zrobił różnicę. Daniel Mita ++

Elizabeth Mattijsen
źródło
2
Dzięki za informację, chociaż nie jestem pewien, czy postępuję zgodnie z akapitem drugim. Tworzenie ciągu nie jest tym, co robi różnicę, robi to podpis dla bloku (ma tę samą wartość tożsamości, jeśli usunę podpis, ale zachowam ciąg).
Daniel Mita,