デフォルトのRaku if / while / loop / whenブロックがすべて同じID値(.WHICH)を持っているのはなぜですか?


9

署名を宣言したブロックを除いて、すべてのブロックは同じID値を持ち、それらがどこで発生したかに関係なく、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。ID値については、.WHICHメソッドを呼び出す必要があります。幸い、このBlock.gistメソッド文字列化にID値を含めます。しかし、すべてのオブジェクトがそうであるとは限りません。

そこに表示されているのは、静的オプティマイザの動作です。ブロック内では何も起こらないため、破棄できます。異なる場合(別の署名を指定した場合)異なります。あなたがこのスクリプトを実行する場合--optimize=0--optimize=1、すべてのブロックがします異なるID値を持っています。

言及&?BLOCKしても静的オプティマイザがスコープをフラット化するのを妨げない問題だと言えるでしょう。一方、これをDIHWIDTのケースと呼ぶこともできます(医師、これを行うと痛い)。だからそれをしないでください:-)

更新:それは違いを作った別の署名です。ダニエル・ミタ++


2
情報をありがとうございます。ただし、2番目のパラグラフについてはわかりません。文字列の作成は違いを生むものではありません。それは、ブロックの署名です(署名を削除しても文字列を保持する場合、ID値は同じです)。
Daniel Mita
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.