Warum hat das Standard-Raku if / while / loop / when-Blöcke alle den gleichen Identitätswert (.WHICH)?

9

Mit Ausnahme des Blocks, in dem ich eine Signatur deklariert habe, haben alle Blöcke denselben Identitätswert und behaupten, in Zeile 1 deklariert zu werden, unabhängig davon, wo sie auftreten. Könnte jemand etwas Licht ins Dunkel bringen, warum dies der Fall ist?

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
quelle

Antworten:

6

Zuallererst: .saygibt Ihnen NICHT den Identitätswert, da dies die .gistMethode für den angegebenen Ausdruck aufruft . Für den Identitätswert müssen Sie die .WHICHMethode aufrufen . Glücklicherweise ist die Block.gistMethode hat den Identitätswert in seiner stringification umfassen. Dies ist jedoch nicht für alle Objekte garantiert.

Was Sie dort sehen, ist der statische Optimierer bei der Arbeit: Da im Block nichts passiert, kann er verworfen werden. In dem einen Fall , in dem es anders ist (wo man eine alternative Signatur angegeben), es ist anders. Wenn Sie dieses Skript mit laufen --optimize=0oder --optimize=1, dann werden alle Blöcke werden unterschiedliche Identitätswerte haben.

Ich denke, Sie könnten es ein Problem nennen, bei dem das Erwähnen &?BLOCKden statischen Optimierer nicht daran hindert, den Bereich zu verkleinern. Auf der anderen Seite könnte man dies auch einen Fall von DIHWIDT nennen (Doktor, es tut weh, wenn ich das tue). Also mach das dann nicht :-)

UPDATE: Es ist die unterschiedliche Signatur, die den Unterschied ausmacht. Daniel Mita ++

Elizabeth Mattijsen
quelle
2
Danke für die Info, obwohl ich nicht sicher bin, ob ich dem 2. Absatz folge. Die Erstellung der Zeichenfolge macht keinen Unterschied, sondern die Signatur für den Block (sie hat denselben Identitätswert, wenn ich die Signatur entferne, aber die Zeichenfolge behalte).
Daniel Mita