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


9

除了我声明签名的代码块外,所有代码块都具有相同的标识值,并声称无论在何处都在第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;
}

Answers:


6

首先:.say不是给你的身份价值,因为调用.gist给定的表达方法。对于身份值,您需要调用.WHICH方法。幸运的是,该Block.gist方法确实将身份值包括在其字符串化中。但这并不能保证所有对象都是如此。

您在这里看到的是正在使用的静态优化器:由于该块内什么都没有发生,因此可以将其丢弃。在一种不同的情况下(您指定了备用签名),它有所不同。如果使用--optimize=0或运行此脚本--optimize=1,则所有块具有不同的标识值。

我猜您可以称其为提及&?BLOCK不会抑制静态优化器使范围变平的问题。另一方面,您也可以将其称为DIHWIDT(医生,我这样做时会受伤)。所以不要那样做:-)

更新:是不同的签名才有所作为。丹尼尔·米塔++


2
感谢您提供信息,尽管我不确定我是否遵循第二段。字符串的创建并没有什么不同,它是块的签名(如果我删除签名但保留字符串,它具有相同的标识值)。
丹尼尔·米塔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.