기본 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방법 식별 값에 문자열을 포함시킵니다. 그러나 이것이 모든 객체에 해당되는 것은 아닙니다 .

여기서 볼 수있는 것은 작업중인 정적 옵티 마이저입니다. 블록 내부에서 아무 일도 일어나지 않기 때문에 버릴 수 있습니다. 다른 경우 (대체 서명을 지정한 경우) 다릅니다. 당신이이 스크립트를 실행하는 경우 --optimize=0또는 --optimize=1, 모든 블록이 됩니다 다른 ID 값을 가지고있다.

언급 &?BLOCK해도 정적 최적화 프로그램이 범위를 평탄화하는 것을 방해하지 않는 문제라고 할 수 있습니다. 반면에, 이것을 DIHWIDT (의사, 내가 할 때 아프다)의 경우라고 부를 수도 있습니다. 그래서 그렇게하지 마십시오 :-)

업데이트 : 차이를 만든 것은 다른 서명입니다. 다니엘 미타 ++


2
나는 두 번째 단락을 따를 지 확실하지 않지만 정보를 주셔서 감사합니다. 문자열 생성은 차이를 만드는 것이 아니라 블록의 서명입니다 (서명을 제거하지만 문자열을 유지하면 동일한 ID 값을 가짐).
Daniel Mita
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.