Le code donné dans ce fil ne fonctionne plus: comment puis-je ré-bénir un objet en Perl 6?
J'ai écrit ce morceau de code l'année dernière, et cela a fonctionné ensuite. Maintenant, ce n'est pas le cas:
class Person { ; }
class Woman is Person { ; }
my $tom = Person.new;
my $lisa = Woman.new;
say $tom.^name; # -> Person
say $lisa.^name; # -> Woman
Metamodel::Primitives.rebless($tom, Woman);
# -> New type Woman for Person is not a mixin type
Le message d'erreur n'a pas de sens, car il est censé fonctionner avec des classes héritées. C'était du moins le cas.
La documentation n'est pas utile; https://docs.raku.org/routine/rebless
Réponses:
Ce n'était jamais censé être ce général. J'ai conçu cette API et l'ai implémentée en premier lieu, et elle n'a jamais été conçue que comme un détail d'implémentation de mixins.
Jusqu'à très récemment, il ne faisait pas partie de la suite de tests de spécification de langage - et quand il en faisait partie, il avait déjà sa sémantique actuelle, plus restrictive. Les contraintes sont importantes pour des raisons de performances: lorsque nous savons qu'un type n'est pas celui qui peut être la cible d'une opération de mixage, nous pouvons compiler les accès aux attributs JIT sur cet objet en quelque chose de beaucoup plus simple (nous avons payé un déplacement conditionnel supplémentaire sur chaque accès d'attribut avant le changement, et maintenant il suffit de le payer sur les types cibles mixin).
Il est possible de modifier le programme d'origine pour qu'il fonctionne en utilisant le MOP pour construire la classe. En fait, ce qui suit n'est pas tout à fait le programme d'origine; J'ai fait un petit ajustement dans le but de montrer comment on peut fournir des méthodes dans la sous-classe en tant que rôle anonyme, afin d'éviter trop de passe-partout MOP.
Bien que ce soit la correction la plus sémantique directe du programme d'origine, il existe un moyen plus court: utilisez l'
but
opérateur sur l'Person
objet type pour produire un type mixin et le renvoyer, puis ajustez simplement son nom à votre convenance:Ce qui n'est de toute façon qu'une ligne de plus que l'original.
la source
constant Woman = Person but role …
Je ne savais pas que cela pouvait être fait. Et donc, sauf pour laBEGIN
ligne, Raku réussit à peu près à pouvoir faire un paradigme prototypique de style JS!class
mot - clé , alors, en citant à nouveau S12: "par défaut, les objets dérivés deMu
prennent en charge un modèle basé sur une classe assez standard ...bless
... appelle ... les routines BUILD ... la sémantique BUILD par défaut est hérité deMu
". En résumé, je dirais qu'il est plus exact de dire que Raku prend en charge A) "déformant sérieusement même le OO standard basé sur la classe des tourbières avec seulement quelques lignes de code" et B) "OO basé sur un prototype".Voir la réponse de jnthn pour une discussion faisant autorité sur précisément ce qui s'est passé
rebless
et ce qu'il faut faire à ce sujet.Cette réponse (ultra longue!) Peut être lue pour ceux qui souhaitent approfondir les principes et la pratique de l' approche TDD qui sous-tend les travaux sur le langage de programmation Raku et les artefacts connexes tels que le compilateur Rakudo et le contenu docs.raku.org .
Cette réponse est structurée comme des réponses spécifiques à des parties particulières de la question originale d'Arne et des commentaires qu'ils ont écrits en réponse à une version antérieure de cette réponse. Mon intention était de le rendre plus utile à Arne tout en étant, espérons-le, toujours utile aux autres.
J'ai mis à jour la réponse acceptée à cet OS pour créer un lien vers cet OS.
Le changement pertinent a été discuté dans un engagement d'avril 2019 dans lequel jnthn a écrit:
Dans un commentaire il y a 11 jours clôturant le numéro de rakudo GH "Rebless à un type personnalisé ne semble plus fonctionner" , il a écrit:
(Cliquez sur le lien ci-dessus pour des notes sur la façon de faire ce qu'il suggère.)
Ce problème est également abordé un peu plus loin dans le document qui a fonctionné ... il ne l'a pas soudainement ... la documentation ... devrait documenter la section d' appel ci-dessous.
rôti - la r epository o f un ll s pec t ests - détermine quel code Raku est censé faire. (La st de roa st peut être lu comme s upposed t o s.)
Dans un autre message d'avril 2019, jnthn a écrit:
Le fait que le comportement de Rakudo soit spécifié par une suite de tests exécutables est un élément fondamental de l'approche de @ Larry pour garantir que Raku se comporte de manière fiable [1] et a de profondes implications [2] .
L'impact de ce changement sur un module largement utilisé
Voici un aperçu de l'impact de ce changement qui se déroule pour le module populaire Inline :: Perl5.
En avril 2019, niner a ouvert un numéro de rakudo GH sur l'impact sur
Inline::Perl5
et j'ai extrait ci-dessous quelques faits saillants de l'échange entre niner et jnthn.(J'ai élidé certaines choses qui étaient importantes dans le contexte d'origine, mais distrayantes dans le contexte de cet OS. Veuillez ne pas supposer que vous avez une compréhension complète de la conversation originale de cet extrait. En cas de doute, cliquez sur le lien. )
Aider avec les documents
Dans un commentaire ci-dessous, vous avez écrit cette réponse:
Cela me semble être une réponse très appropriée et utile au problème au cœur de votre SOQ. J'espère que nous avons la chance que cela se réalise.
Imo votre rédaction technique est excellente, donc j'espère que le résultat final de votre collaboration avec d'autres personnes impliquées dans l'amélioration sera une chose merveilleuse.
Contraintes fondamentales sur le contenu de docs.raku.org
Une grande partie de la raison pour laquelle j'ai écrit le reste de cette réponse très complète à une question aussi simple en apparence et que j'ai rétablie après l'avoir supprimée une fois que Jonathan y avait répondu, était de discuter des principes et de la pratique de la approche TDD sur laquelle reposent les travaux. le langage de programmation Raku et les artefacts associés tels que le compilateur Rakudo et le contenu docs.raku.org .
Aiui, la relation souhaitable entre comment les choses sont censées fonctionner à Raku, et comment elles fonctionnent réellement à Rakudo, et comment les choses sont censées être documentées sur docs.raku.org se résume à:
Tout DOIT être présumé être à jamais soumis à la nature fondamentale d'un projet de bénévolat; et, dans le cadre de cette contrainte:
Le comportement du rôti DEVRAIT être documenté et aucun autre comportement NE DEVRAIT PAS.
(Compte tenu du temps, de l'intérêt et du consensus des bénévoles disponibles, des exceptions sont parfois faites pour documenter le comportement d'un Rakudo correctement certifié qui n'est pas couvert par le rôti. Dans la pratique actuelle, cela semble signifier le comportement d'une version Rakudo dans une Rakudo Star publiée.)
Documentation inutile
J'ai considéré cela comme un commentaire juste. Tout bien considéré, la documentation telle qu'elle était lorsque vous avez rédigé votre question n'était pas utile.
Ceci est une déclaration très différente.
Il n'y avait aucune entrée de rôti couvrant
rebless
à ce moment-là.Si la page docs.raku.org sur
rebless
avait décrit son comportement tel qu'il était en 2018, cela aurait été pire qu'inutile car cela suggérerait à tort que le comportement alors en vigueur était pris en charge. En réalité, il était possible qu'il s'introduise dans une future version de Rakudo sans perspective raisonnable, le comportement de 2018 serait rétabli par les principaux développeurs. Et en effet, cela s'est produit: son comportement non pris en charge à partir de 2018 s'est rompu et n'a pas été réintégré.Donc, étant donné le consensus sur ce qui appartient à docs.raku.org et ce qui ne le fait pas (voir ci-dessus), la chose la plus utile que sa
rebless
page pourrait faire était de ne pas documenterrebless
du tout ou, peut-être mieux, d'inclure une page pour cela, mais assurez-vous qu'il n'a pas décrit son comportement. Quelle était la situation: la page existait; n'était pas directement utile; et c'était sans doute mieux que rien.(Il est facile d'imaginer que les choses s'améliorent encore. Par exemple, que se passerait-il si les pages documentant les fonctions incluaient un pourcentage documentant l'état de la couverture de test associée à cette fonction dans la version de Rakudo dans la dernière Rakudo Star? Un 0% pourrait immédiatement indiquer un lecteur à une prise de conscience que cette fonction n'était pas couverte par le rôti. Cela dit, bien que cette fonctionnalité de doc soit facile à imaginer , qui va l'implémenter? Il est tout aussi facile d'imaginer que cela pourrait prendre une année civile ou plus de travail assidu et la collaboration pour mettre en œuvre et déployer utilement, et que les gens pensent que d'autres choses sont plus importantes.)
ça a fonctionné ... ça n'a tout à coup pas fonctionné ... la documentation ... devrait documenter l'appel
C'était de la «chance», ça a marché.
Parce que Rakudo a été amélioré.
Comme expliqué précédemment, le consensus et / ou les pratiques de travail actuels de la communauté sont les suivants: la documentation DEVRAIT documenter une version particulière de l'appel, à savoir le comportement de torréfaction de la version de Rakudo dans la dernière Rakudo Star; et PEUT documenter le comportement dans d'autres versions.
Aiui, le consensus actuel et / ou la pratique de travail est que ce que certains pourraient considérer comme des contributions doc "faibles", par exemple un contenu bref et rédigé à la hâte et / ou des liens en dehors des documents, PEUT être introduit si les volontaires sentent qu'un changement immédiat est justifié pour refléter une certaine inquiétude soulevée par un utilisateur (par exemple, cet OS) et qu'il serait préférable de faire le changement "faible" plutôt que de ne rien faire du tout. Vous pouvez bien sûr faire un RP pour l'améliorer (ou le revenir en arrière si vous sentez vraiment qu'un changement est si "faible" qu'il aggrave les choses).
(C'est quelque chose comme ça d'après mon décompte aussi, bien que j'ai vu un compilateur prétendant être 2019.03.1 avec la même rupture de comportement. [3] )
Je pense que JJ a fait le changement de doc et il a juste mal interprété le commentaire de jnthn sur la façon de s'adapter au changement. Je pense actuellement que c'est mieux que rien, mais je suis impatient de le mettre à jour. :)
Notes de bas de page
[1] Ce qui suit a été dit quelques minutes après que Larry avait annoncé pour la première fois le projet qui avait mené à Raku dans son discours de 2000 sur "L'état de l'oignon" :
[2] Bien sûr, le rôti ne fonctionne bien pour un utilisateur donné que si ses tests couvrent suffisamment les besoins de l'utilisateur. Le problème d'Arne montre à quel point les trous dans la couverture peuvent être surprenants. Pour une discussion de ces trous tels qu'ils se présentaient en 2018, voir À propos des spécifications, du contrôle de version, des modifications et… des bris . La bonne nouvelle est que le rôti n'est que de nombreux tests unitaires écrits en Raku pour tester que les expressions ou les constructions avec des valeurs particulières font une chose particulière. Il est donc facile pour les particuliers ou les entreprises de contribuer à de nouveaux tests pour améliorer la couverture des tests. Et tout est sous contrôle de version (git), donc les balises, les branches et les fourches personnalisées en aval sont viables, durables et gérables. ( En effet, c'est comment les nouvelles versions linguistiques (
Christmas
,Diwali
,Eid
(?), Etc.) sont gérées.)[3] J'ai vu une tentative de ré-bénédiction d'une nouvelle classe créée en utilisant la
newclass is oldclass
syntaxe régulière à la fois travailler (sur mon ordinateur portable) et ne pas fonctionner (sur repl.it) en utilisant des compilateurs qui prétendent l'être2019.03.1
. (On peut supposer que repl.it a installé une version du code source du compilateur, ou un binaire compilé à partir de celui-ci, extrait de la tête principale peu de temps après la mise à jour de la version du compilateur2019.03.1
, avec le changement de rupture en place. Je note que repl.it n'a pas '' Je n'ai pas rendu public leur raku en ligne - je l'ai découvert par accident - il n'y a donc rien de fâcheux dans cette situation mais cela a renforcé pour moi la nécessité de la$RAKU.compiler.verbose-config
méthode utilisée dans les sorties travaillées / cassées que je viens de relier.)la source
Question de suivi: Voir Raku Rebless et plusieurs classes
la source