Чому Raku за замовчуванням, якщо / while / loop / коли всі блоки мають однакове значення ідентичності (.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метод так і є включає значення ідентичності в його строфікацію. Але це не гарантовано стосується всіх об'єктів.

Те, що ви там бачите, - це статичний оптимізатор на роботі: оскільки всередині блоку нічого не відбувається, його можна відкинути. В одному випадку , коли він відрізняється (де ви вказали додаткову підпис), то є різна. Якщо ви запускаєте цей скрипт з --optimize=0або --optimize=1, то всі блоки матимуть різні значення ідентичності.

Я думаю, ви можете назвати це проблемою, що згадування &?BLOCKне перешкоджає статичному оптимізатору розгладжувати область. З іншого боку, ви можете також назвати це випадком DIHWIDT (Лікар, боляче, коли я це роблю). Тож не робіть цього тоді :-)

ОНОВЛЕННЯ: саме підпис змінив свою різницю. Даніель Міта ++


2
Дякую за інформацію, хоча я не впевнений, що я дотримуюся другого пункту. Створення рядка не є тим, що має значення, це підпис блоку, який це робить (він має те саме значення ідентичності, якщо я видаляю підпис, але зберігаю рядок).
Даніель Міта
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.