Почему по умолчанию 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;
}
Даниэль Мита
источник

Ответы:

6

Прежде всего: .sayэто НЕ даст вам значение идентификатора, потому что вызывает .gistметод на данном выражении. Для значения идентификатора вам нужно вызвать .WHICHметод. К счастью, Block.gistметод действительно включает значение идентификатора в его stringification. Но это не гарантируется для всех объектов.

Что вы видите, так это статический оптимизатор в действии: поскольку внутри блока ничего не происходит, его можно отбросить. В одном случае , когда он отличается (где вы указали дополнительную подпись), то есть разная. Если вы запустите этот скрипт с помощью --optimize=0или --optimize=1, то все блоки будут иметь разные значения идентичности.

Я думаю, вы могли бы назвать это проблемой, упоминание &?BLOCKкоторой не мешает статическому оптимизатору сгладить область видимости. С другой стороны, вы также можете назвать это случаем DIHWIDT (Доктор, мне больно, когда я это делаю). Так что не делай этого тогда :-)

ОБНОВЛЕНИЕ: это другая подпись, которая имела значение. Даниэль Мита ++

Элизабет Маттийсен
источник
2
Спасибо за информацию, хотя я не уверен, что следую за 2-м абзацем. Создание строки - это не то, что имеет значение, это подпись для блока (она имеет то же значение идентификатора, если я удаляю подпись, но сохраняю строку).
Даниэль Мита