为什么默认的 Raku if/while/loop/when 块都具有相同的标识值 (.WHICH)?

Why do the default Raku if/while/loop/when blocks all have the same identity value (.WHICH)?

除了我声明签名的区块外,所有区块都具有相同的标识值,并且无论它们出现在哪里都声称在第 1 行声明。谁能解释一下为什么会这样?

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;
}

首先:.say NOT 不会给你标识值,因为它会调用给定表达式的 .gist 方法。对于标识值,需要调用.WHICH方法。幸运的是,Block.gist 方法 确实 在其字符串化中包含标识值。但并非保证所有对象都是如此。

你在那里看到的是静态优化器在工作:因为块内没有发生任何事情,所以它可以被丢弃。在一种不同的情况下(您指定了备用签名),它 不同的。如果您 运行 此脚本带有 --optimize=0--optimize=1,则所有块 具有不同的标识值。

我想您可以将其称为提及 &?BLOCK 不会阻止静态优化器展平范围的问题。另一方面,您也可以将此称为 DIHWIDT(医生,当我这样做时很痛)。所以不要那样做:-)

更新:造成差异的是不同的签名。丹尼尔米塔++