Kod podany w tym wątku już nie działa: Jak mogę zbuntować obiekt w Perlu 6?
Napisałem ten fragment kodu w zeszłym roku i wtedy zadziałało. Teraz nie:
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
Komunikat o błędzie nie ma sensu, ponieważ powinien działać z klasami dziedziczonymi. Tak przynajmniej było.
Dokumentacja nie jest pomocna; https://docs.raku.org/routine/rebless
Odpowiedzi:
To nigdy nie miało być tak ogólne. Zaprojektowałem ten interfejs API i zaimplementowałem go w pierwszej kolejności, a jego przeznaczeniem był tylko szczegół implementacji mixinów.
Do niedawna nie był częścią zestawu testów specyfikacji języka - a kiedy stał się jego częścią, miał już swoją obecną, bardziej restrykcyjną semantykę. Ograniczenia na nim są ważne ze względu na wydajność: kiedy wiemy, że typ nie jest celem, który może być celem operacji mixin, możemy uzyskać dostęp do atrybutu kompilacji JIT dla tego obiektu w coś znacznie prostszego (zapłaciliśmy dodatkowy ruch warunkowy dostęp do wszystkich atrybutów przed zmianą, a teraz trzeba płacić tylko za typy docelowe mixin).
Możliwe jest zmodyfikowanie oryginalnego programu do pracy za pomocą MOP do zbudowania klasy. W rzeczywistości poniższe programy nie są oryginalnym programem; Zrobiłem drobną poprawkę, aby pokazać, jak można zapewnić metody w podklasie jako anonimową rolę, aby uniknąć zbyt dużej liczby płyt MOP.
Chociaż jest to najbardziej semantycznie bezpośrednia poprawka do oryginalnego programu, istnieje krótszy sposób: użyj
but
operatora naPerson
obiekcie typu, aby utworzyć typ miksu i zwróć go, a następnie dostosuj jego nazwę do własnych upodobań:Co i tak jest tylko jedną linią dodatkową niż oryginał.
źródło
constant Woman = Person but role …
Nie zdawałem sobie sprawy, że można to zrobić. I tak, ale jeśli chodzi oBEGIN
linię, Raku właśnie zaczyna robić prototypowy paradygmat w stylu JS!class
słowa kluczowego , a następnie, powołując S12 znowu: „Domyślnie obiekty pochodzące zeMu
wsparcia dość standardowy model klasy oparte ...bless
... rozmowy ... rutyny budowy ... domyślnym BUILD semantyka odziedziczony zMu
”. Podsumowując, twierdzę, że dokładniej jest powiedzieć, że Raku obsługuje A) „poważnie wypacza nawet OO oparte na klasach OO za pomocą zaledwie kilku linii kodu” i B) „OO oparte na prototypie”.Zobacz odpowiedź jnthna, aby uzyskać autorytatywną dyskusję na temat tego, co dokładnie się stało
rebless
i co z tym zrobić.Ta (bardzo długa!) Odpowiedź może być warta przeczytania dla osób zainteresowanych dalszą dyskusją na temat zasad i praktyki podejścia TDD, które leży u podstaw pracy nad językiem programowania Raku i powiązanymi artefaktami, takimi jak kompilator Rakudo i zawartość docs.raku.org .
Ta odpowiedź składa się z konkretnych odpowiedzi na poszczególne części pierwotnego pytania Arne i komentarzy, które napisali w odpowiedzi na wcześniejszą wersję tej odpowiedzi. Moim zamiarem było uczynienie go bardziej użytecznym dla Arne, a jednocześnie, mam nadzieję, nadal przydatnym dla innych.
Zaktualizowałem zaakceptowaną odpowiedź na to pisemne zgłoszenie zastrzeżeń, aby utworzyć link do tego pisemnego zgłoszenia zastrzeżeń.
Odpowiednią zmianę omówiono w zobowiązaniu z kwietnia 2019 r., W którym jnthn napisał:
W komentarzu 11 dni temu zamykającym problem rakudo GH „Rebless do niestandardowego typu już nie działa” , napisał:
(Kliknij powyższy link, aby zobaczyć, jak to zrobić.)
Zagadnienie to jest również omówione nieco dalej, ponieważ zadziałało ... nagle nie ... dokumentacja ... powinna udokumentować poniższą sekcję wywołania .
pieczeń - w R epository O Fll s Pec t EST - określa, jaki kod Raku ma zrobić. (The st z roa st można odczytać jako y upposed t O a).
W innej wiadomości z kwietnia 2019 r. Jnthn napisał:
Fakt, że zachowanie Rakudo jest określone przez wykonywalny pakiet testowy, jest podstawową częścią podejścia @ Larry'ego do zapewnienia, że Raku zachowuje się niezawodnie [1] i ma głębokie implikacje [2] .
Wpływ tej zmiany na szeroko stosowany moduł
Oto migawka wpływu tej zmiany na popularny moduł Inline :: Perl5.
W kwietniu 2019 r. Niner
Inline::Perl5
otworzył problem rakudo GH dotyczący wpływu, a poniżej wyodrębniłem niektóre najważniejsze informacje o wymianie między niner i jnthn.(Pomyślałem o rzeczach, które były ważne w oryginalnym kontekście, ale rozpraszałem w kontekście tego SO. Nie zakładaj, że masz pełne zrozumienie oryginalnej rozmowy z tego wyciągu. W razie wątpliwości kliknij link. )
Pomoc z dokumentami
W komentarzu poniżej tej odpowiedzi napisałeś:
To brzmi dla mnie jak bardzo odpowiednia i przydatna odpowiedź na problem w sercu twojego SOQ. Mam nadzieję, że mamy szczęście, że tak się stanie.
Imo twoje techniczne pisanie jest doskonałe, więc mam nadzieję, że końcowy efekt współpracy z innymi osobami zaangażowanymi w jego ulepszanie byłby cudowny.
Podstawowe ograniczenia dotyczące zawartości docs.raku.org
Dużą częścią powodu, dla którego napisałem resztę tej bardzo obszernej odpowiedzi na tak pozornie proste pytanie, i przywróciłem ją po początkowym usunięciu, gdy Jonathan na nią odpowiedział, było omówienie zasad i praktyki podejścia TDD, które leży u podstaw pracy język programowania Raku i powiązane artefakty, takie jak kompilator Rakudo i zawartość docs.raku.org .
Aiui, pożądany związek między tym, jak rzeczy mają działać w Raku, a tym, jak faktycznie działają w Rakudo, a tym, jak rzeczy powinny być dokumentowane na docs.raku.org sprowadza się do:
Wszystko NALEŻY zakładać, że na zawsze podlega fundamentalnej naturze projektu wolontariackiego; oraz w ramach tego ograniczenia:
Zachowanie w pieczeniu POWINNY być udokumentowane, a inne zachowanie NIE POWINIEN.
(Biorąc pod uwagę dostępny czas ochotnika, zainteresowanie i konsensus, od czasu do czasu zdarzają się wyjątki w celu udokumentowania zachowania Rakudo o odpowiedniej jakości, który nie jest objęty pieczeniem. W obecnej praktyce wydaje się to oznaczać zachowanie wersji Rakudo w wydanej Gwiazdie Rakudo.)
Bezużyteczna dokumentacja
Uznałem to za uczciwy komentarz. Biorąc to wszystko pod uwagę, dokumentacja, jaka była podczas pisania pytania, nie była pomocna.
To jest zupełnie inne stwierdzenie.
W
rebless
tym czasie nie było żadnego wejścia do pieczeni .Jeśli strona docs.raku.org na
rebless
miał opisano jego zachowanie, jak to było w 2018 roku, wtedy to byłoby gorzej niż bezużyteczne , ponieważ byłoby to błędnie sugerować, że wtedy prąd zachowanie było obsługiwane. W rzeczywistości istniała możliwość złamania przyszłej wersji Rakudo bez uzasadnionej perspektywy, że zachowanie z 2018 r. Zostanie przywrócone przez głównych programistów. I rzeczywiście tak się stało: jego nieobsługiwane zachowanie z 2018 r. Pękło i nie zostało przywrócone.Biorąc pod uwagę konsensus co do tego, co należy do docs.raku.org, a co nie (patrz wyżej), najbardziej pomocną rzeczą, jaką
rebless
może zrobić jego strona, jest albo nie dokumentowanierebless
wcale, albo, być może lepiej, założenie strony, ale upewnij się, że nie opisał swojego zachowania. Tak wyglądała sytuacja: strona istniała; nie był bezpośrednio pomocny; i to było prawdopodobnie lepsze niż nic.(Łatwo jest sobie wyobrazić, że sytuacja jest jeszcze lepsza. Na przykład, co jeśli strony dokumentujące funkcje zawierały procent dokumentujący stan pokrycia testowego związanego z tą funkcją w wersji Rakudo w najnowszej Rakudo Star? 0% mogłoby natychmiast wskazać czytelnikowi w świadomości, że ta funkcja nie była objęta pieczeniem. To powiedziawszy, chociaż ta funkcja doc jest łatwa do wyobrażenia , kto ją wdroży? Równie łatwo jest wyobrazić sobie, że zajęłoby to rok kalendarzowy lub więcej starannej pracy i współpracy w celu użytecznego wdrażania i wdrażania, a ludzie uważają, że inne rzeczy są ważniejsze).
zadziałało ... nagle nie zadziałało ... dokumentacja ... powinna udokumentować połączenie
To było „szczęście”, że zadziałało.
Ponieważ Rakudo zostało ulepszone.
Jak wyjaśniono wcześniej, aiui obecny konsensus Wspólnoty i / lub praktyką jest: dokumentacja POWINIEN dokumentują konkretną wersję połączenia, czyli pieczeń „zachowania D dla wersji Rakudo w najnowszej Rakudo Gwiazda; i MOŻE zachowywać dokument w innych wersjach.
Aiui, obecny konsensus i / lub praktyka robocza jest taka, że to, co niektórzy mogą uznać za „słaby” wkład doktora, np. Niektóre krótkie, pośpiesznie napisane treści i / lub linki poza dokumentami, MOGĄ zostać wprowadzone, jeśli wolontariusze uważają, że uzasadniona jest natychmiastowa zmiana w celu odzwierciedlenia pewne obawy zgłaszane przez użytkownika (np. niniejsze pisemne zgłoszenie zastrzeżeń) i fakt, że wprowadzenie „słabej” zmiany byłoby lepsze niż nic nie robienie. Możesz oczywiście zrobić PR, aby go poprawić (lub cofnąć, jeśli naprawdę uważasz, że zmiana jest tak „słaba”, że pogarsza sytuację).
(Coś takiego też jest według moich obliczeń, chociaż widziałem kompilator podający się za 2019.03.1 z tym samym przerwaniem w zachowaniu. [3] )
Myślę, że JJ zmienił dokumentację, a on po prostu źle zinterpretował komentarz Jnthna na temat sposobu dostosowania się do zmiany. Obecnie uważam, że to lepsze niż nic, ale czekam na aktualizację. :)
Przypisy
[1] Kilka minut po tym, jak Larry po raz pierwszy ogłosił projekt, który doprowadził do Raku w jego przemówieniu z 2000 r. „State of the Onion” :
[2] Oczywiście pieczeń sprawdza się dobrze dla danego użytkownika, jeśli jego testy w wystarczającym stopniu zaspokoją jego potrzeby. Problem Arne pokazuje, jak dziury w zasięgu mogą być zaskakujące. Aby zapoznać się z omówieniem tych dziur w 2018 r., Zobacz Specyfikacje, wersjonowanie, zmiany i… Złamanie . Dobrą wiadomością jest to, że pieczeń to tylko wiele testów jednostkowych napisanych w Raku, aby sprawdzić, czy wyrażenia lub konstrukcje o określonych wartościach wykonują określoną czynność. Osobom i korporacjom łatwo jest zatem wnosić nowe testy, aby poprawić ich zasięg. Wszystko to jest pod kontrolą wersji (git), więc niestandardowe tagi, gałęzie i widelce downstream są opłacalne, trwałe i łatwe w zarządzaniu. (Rzeczywiście, to w jaki sposób nowe wersje językowe (
Christmas
,Diwali
,Eid
(?), Itd.) Są zarządzane.)[3] Widziałem próbę ponownego zbudowania nowej klasy utworzonej przy użyciu regularnej
newclass is oldclass
składni, która działa (na moim laptopie) i nie działa (na repl.it) przy użyciu kompilatorów, które tak twierdzą2019.03.1
. (Najprawdopodobniej repl.it zainstalował wersję kodu źródłowego kompilatora lub skompilowaną z niego wersję binarną, pobraną z głowicy głównej wkrótce po zaktualizowaniu wersji kompilatora2019.03.1
, z przełomową zmianą. Zauważam, że repl.it nie ma ' t opublikował swoje internetowe repliki raku - odkryłem to przez przypadek - więc nie ma nic złego w tej sytuacji, ale wzmocniło to dla mnie potrzebę zastosowania$RAKU.compiler.verbose-config
metody zastosowanej w przetworzonych / uszkodzonych wyjściach, które właśnie połączyłem.)źródło
Dalsze pytanie: Zobacz Raku Rebbless i wiele klas
źródło