기본 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.