Objet cloné Raku non coulé

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';

Impressions ci-dessus:

sinking...2
Done

Cependant, si la cloneméthode personnalisée est utilisée, le clone renvoyé par cccne sera pas coulé pour une raison quelconque. Cela fonctionne si je sinkle fais explicitement sur le site d'appel ou si je change la my $clone = callwith(|%_)ligne en my $clone := callwith(|%_). Est-ce prévu? Quelle est la raison pour laquelle cela fonctionne de cette façon?

Merci!

Réponses

3 raiph Aug 21 2020 at 07:21

Il y a beaucoup de bogues de puits classés et toujours ouverts des années plus tard (et, je suppose, des charges qui n'ont pas été classées).

Comme évoqué dans ma réponse au dernier élément d'un bloc jeté dans le contexte du puits :

quelqu'un a besoin de nettoyer l'évier de la cuisine, c'est-à-dire de reprendre là où Zoffix s'est arrêté avec ses défauts dans un problème implicite de naufrage / et d'aide indésirable .

La conclusion de Zoffix était:

Donc, étant donné qu'il y a tellement de problèmes avec le système, je me demande simplement s'il n'y en a pas un meilleur qui puisse être utilisé pour indiquer si quelque chose est voulu ou non.

Avance rapide de 2 ans, et un meilleur système va, espérons-le, atterrir. Dans un récent rapport de subvention, jnthn écrit:

Le code actuel faisant ce travail dans Rakudo est difficile à suivre et pas très efficace. ... Puisque RakuAST modélise le langage à un niveau supérieur et reporte la production de QAST à beaucoup plus tard, une solution beaucoup plus propre au problème d'analyse des puits est possible. ... je suis optimiste que le modèle que j'ai créé sera suffisamment flexible pour gérer toutes les exigences liées au naufrage

2 ElizabethMattijsen Aug 20 2020 at 21:10

Je ne sais pas encore ce qui se passe, mais la suppression de l' returninstruction oblige l'objet cloné à appeler la bonne sinkméthode.

J'ai créé un problème pour cela: https://github.com/rakudo/rakudo/issues/3855