라쿠 복제 된 개체가 침몰하지 않음

Aug 20 2020
class A {
  has $.n; # If this method is uncommented then the clone won't be sunk # method clone { # my $clone = callwith(|%_);
#    return $clone; # } method sink(-->Nil) { say "sinking...$!n" }
}

sub ccc(A:D $a) { $a.clone(n=>2) }

ccc(A.new(n=>1));
say 'Done';

위 인쇄 :

sinking...2
Done

그러나 사용자 지정 clone메서드를 사용하면 반환 된 복제본 ccc이 어떤 이유로 든 가라 앉지 않습니다. 나는 경우 작동 sink나는 변경 호출 사이트에서 또는 경우 명시 적 my $clone = callwith(|%_)으로 선을 my $clone := callwith(|%_). 이것이 예상 되는가? 이런 식으로 작동하는 이유는 무엇입니까?

감사!

답변

3 raiph Aug 21 2020 at 07:21

몇 년 동안 제출되고 여전히 열려있는 싱크 버그 (그리고 제출되지 않은로드)가 많이 있습니다.

싱크 컨텍스트에서 던져진 블록의 마지막 요소에 대한 내 답변 에서 언급했듯이 :

누군가 부엌 싱크대를 청소해야합니다. 즉, Zoffix 가 묵시적 침몰 / 원치 않는 도우미 문제 에서 결함으로 중단 한 부분을 선택합니다 .

Zoffix의 결론은 다음과 같습니다.

그래서 시스템에 너무 많은 문제가 있다는 점을 감안할 때, 무언가가 필요한지 여부를 나타내는 데 사용할 수있는 더 나은 문제가 없는지 궁금합니다.

2 년이 지나면 더 나은 시스템이 출시 될 것입니다. 에서 최근 보조금 보고서 jnthn의 쓰기 :

Rakudo에서이 작업을 수행하는 현재 코드는 따라 가기가 어렵고 효율적이지 않습니다. ... RakuAST는 더 높은 수준의 언어를 모델링하고 훨씬 나중에 QAST 생성을 연기하기 때문에 싱크 분석 문제에 대한 훨씬 더 깨끗한 솔루션이 가능합니다. ... 내가 만든 모델이 모든 침몰 관련 요구 사항을 처리 할 수있을만큼 유연 할 것이라고 낙관합니다.

2 ElizabethMattijsen Aug 20 2020 at 21:10

아직 무슨 일이 일어나고 있는지 잘 모르겠지만 return문을 제거 하면 복제 된 개체가 올바른 sink메서드를 호출하게 됩니다.

나는 그것에 대한 문제를 만들었습니다. https://github.com/rakudo/rakudo/issues/3855