Kode yang diberikan di utas ini tidak berfungsi lagi: Bagaimana saya bisa rebless objek di Perl 6?
Saya menulis kode ini tahun lalu, dan itu berhasil saat itu. Sekarang tidak:
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
Pesan kesalahan tidak masuk akal, karena seharusnya berfungsi dengan kelas bawaan. Setidaknya begitu.
Dokumentasi tidak membantu; https://docs.raku.org/routine/rebless
Jawaban:
Seharusnya tidak seperti itu jenderal. Saya merancang API itu dan mengimplementasikannya sejak awal, dan itu hanya dimaksudkan sebagai detail implementasi mixin.
Sampai baru-baru ini, itu bukan bagian dari paket tes spesifikasi bahasa - dan ketika itu memang menjadi bagian dari itu, sudah memiliki semantik saat ini, lebih ketat,. Kendala itu penting untuk alasan kinerja: ketika kita tahu suatu tipe bukan tipe yang bisa menjadi target operasi mixin, kita dapat mengakses atribut JIT-compile pada objek itu menjadi sesuatu yang lebih sederhana (kita membayar langkah bersyarat tambahan pada setiap akses atribut sebelum perubahan, dan sekarang hanya perlu membayarnya pada tipe target mixin).
Dimungkinkan untuk memodifikasi program asli untuk bekerja dengan menggunakan MOP untuk membangun kelas. Sebenarnya, berikut ini bukan program yang asli; Saya melakukan tweak kecil demi menunjukkan bagaimana seseorang dapat memberikan metode dalam subkelas sebagai peran anonim, sehingga untuk menghindari terlalu banyak boilerplate MOP.
Walaupun itu adalah perbaikan paling semantik langsung ke program asli, ada cara yang lebih singkat: gunakan
but
operator padaPerson
objek tipe untuk menghasilkan tipe mixin dan kembalikan, dan kemudian sesuaikan namanya sesuai keinginan Anda:Yang hanya satu baris ekstra dari yang asli pula.
sumber
constant Woman = Person but role …
Tidak menyadari bahwa itu bisa dilakukan. Dan dengan demikian tetapi untukBEGIN
garis, Raku hampir berhasil melakukan paradigma prototipe gaya JS juga!class
kata kunci , maka, mengutip S12 lagi: "secara default, objek yang berasal dariMu
mendukung model berbasis kelas yang cukup standar ...bless
... panggilan ... BUILD rutin ... standar semantik BUILD adalah diwarisi dariMu
". Singkatnya, saya berpendapat bahwa lebih akurat untuk mengatakan bahwa Raku mendukung A) "serius membengkokkan bahkan standar standar berbasis rawa babi hanya dengan beberapa baris kode" dan B) "OO berbasis prototipe."Lihat jawaban jnthn untuk diskusi resmi tentang apa yang terjadi
rebless
dan apa yang harus dilakukan.Jawaban (sangat panjang!) Ini mungkin layak dibaca bagi mereka yang tertarik untuk berdiskusi lebih lanjut tentang prinsip-prinsip dan praktik pendekatan TDD yang mendasari kerja pada bahasa pemrograman Raku dan artefak terkait seperti konten Rakudo dan konten docs.raku.org .
Jawaban ini disusun sebagai respons spesifik terhadap bagian tertentu dari pertanyaan awal Arne dan komentar yang mereka tulis sebagai tanggapan terhadap versi sebelumnya dari jawaban ini. Maksud saya adalah untuk membuatnya lebih bermanfaat bagi Arne sementara, semoga, tetap bermanfaat bagi orang lain.
Saya telah memperbarui jawaban yang diterima untuk SO itu untuk menautkan ke SO ini.
Perubahan yang relevan dibahas dalam komitmen April 2019 di mana jnthn menulis:
Dalam komentar 11 hari yang lalu menutup masalah rakudo GH "Tidak dapat diubah menjadi tipe kustom tidak lagi berfungsi" , ia menulis:
(Klik tautan di atas untuk catatan tentang bagaimana melakukan apa yang disarankan.)
Masalah ini juga dibahas sedikit lebih jauh dalam kerjanya ... tiba-tiba tidak ... dokumentasi ... harus mendokumentasikan bagian panggilan di bawah ini.
panggang - yang r epository o f suatu ll s PEC t EST - menentukan apa kode Raku yang seharusnya dilakukan. (The st dari roa st dapat dibaca sebagai s upposed t o s.)
Dalam pesan April 2019 yang lain, jnthn menulis:
Fakta bahwa perilaku Rakudo ditentukan oleh suite uji yang dapat dieksekusi adalah bagian mendasar dari pendekatan @ Larry untuk memastikan Raku berperilaku andal [1] dan memiliki implikasi mendalam [2] .
Dampak dari perubahan ini pada modul yang banyak digunakan
Berikut adalah snapshot dari dampak perubahan ini yang sedang berlangsung untuk modul Inline :: Perl5 yang populer.
Pada bulan April 2019, niner membuka masalah rakudo GH tentang dampaknya
Inline::Perl5
dan saya telah mengekstraksi beberapa sorotan dari pertukaran antara niner dan jnthn di bawah ini.(Saya telah menghilangkan beberapa hal yang penting dalam konteks asli, tetapi mengganggu dalam konteks SO ini. Harap jangan menganggap Anda memiliki pemahaman yang lengkap tentang percakapan asli dari ekstrak ini. Jika ragu, klik tautannya. )
Membantu dengan dokumen
Dalam komentar di bawah, jawaban ini Anda tulis:
Bagi saya itu kedengarannya seperti respons yang sangat tepat dan berguna untuk masalah yang menjadi inti dari SOQ Anda. Saya harap kita cukup beruntung sehingga ini terjadi.
Imo tulisan teknis Anda sangat bagus sehingga saya berharap hasil akhir dari Anda bekerja dengan orang lain yang terlibat dalam peningkatan itu akan menjadi hal yang luar biasa.
Kendala mendasar pada konten docs.raku.org
Sebagian besar alasan saya menulis sisa dari jawaban yang sangat luas ini untuk pertanyaan yang tampaknya sederhana, dan mengembalikannya setelah awalnya menghapusnya begitu Jonathan menjawabnya, adalah untuk membahas prinsip-prinsip dan praktik pendekatan TDD yang mendasari kerja pada bahasa pemrograman Raku dan artefak terkait seperti kompilator Rakudo dan konten docs.raku.org .
Aiui, hubungan yang diinginkan antara bagaimana hal-hal seharusnya bekerja di Raku, dan bagaimana mereka sebenarnya bekerja di Rakudo, dan bagaimana hal-hal yang seharusnya didokumentasikan di docs.raku.org bermuara pada:
Semuanya HARUS dianggap selamanya tunduk pada sifat dasar dari proyek sukarela; dan, dalam batasan itu:
Perilaku dalam panggang HARUS didokumentasikan dan perilaku lainnya TIDAK HARUS.
(Mengingat waktu sukarela, minat, dan konsensus yang tersedia, pengecualian kadang-kadang dibuat untuk mendokumentasikan perilaku Rakudo QA'd yang benar yang tidak tercakup oleh daging panggang. Dalam praktik saat ini, ini tampaknya berarti perilaku versi Rakudo dalam Bintang Rakudo yang dirilis.)
Dokumentasi tidak berguna
Saya menganggap ini komentar yang adil. Semua hal dipertimbangkan, dokumentasi seperti ketika Anda menulis pertanyaan Anda tidak membantu.
Ini pernyataan yang sangat berbeda.
Tidak ada entri panggang menutupi
rebless
pada saat itu.Jika halaman docs.raku.org pada
rebless
harus dijelaskan perilakunya seperti di 2018, maka yang akan menjadi lebih buruk daripada tidak berguna karena tidak benar akan menyarankan bahwa perilaku maka saat ini didukung. Pada kenyataannya ada ruang untuk memecahkan dalam versi Rakudo di masa depan tanpa prospek yang masuk akal perilaku 2018 akan dipulihkan oleh para pengembang inti. Dan memang ini terjadi: perilakunya yang tidak didukung sejak 2018 benar-benar hancur, dan tidak dipulihkan.Jadi, mengingat konsensus tentang apa yang termasuk dalam docs.raku.org dan apa yang tidak (lihat di atas), hal yang paling membantu
rebless
halamannya dapat lakukan adalah tidak mendokumentasikanrebless
sama sekali atau, mungkin lebih baik, termasuk halaman untuk itu tetapi pastikan itu tidak menggambarkan perilakunya. Itulah situasinya: halaman itu memang ada; tidak langsung membantu; dan itu bisa dibilang lebih baik daripada tidak sama sekali.(Sangat mudah untuk membayangkan hal-hal yang lebih baik. Misalnya, bagaimana jika fungsi mendokumentasikan halaman termasuk persentase mendokumentasikan keadaan cakupan pengujian yang terkait dengan fungsi itu dalam versi Rakudo di Rakudo Star terbaru? 0% dapat langsung memberi petunjuk kepada pembaca ke kesadaran bahwa fungsi itu tidak tercakup oleh panggang. Yang mengatakan, sementara fitur doc ini mudah dibayangkan , siapa yang akan mengimplementasikannya? Sama mudahnya untuk membayangkan bahwa itu bisa memakan waktu satu tahun kalender atau lebih dari pekerjaan yang rajin dan kolaborasi untuk mengimplementasikan dan menyebarkan, dan orang-orang berpikir hal-hal lain lebih penting.)
itu berhasil ... tiba-tiba tidak ... dokumentasi ... harus mendokumentasikan panggilan
Itu "keberuntungan" itu berhasil.
Karena Rakudo ditingkatkan.
Sebagaimana dijelaskan sebelumnya, yang juga merupakan konsensus komunitas saat ini dan / atau praktik kerja adalah: dokumentasi HARUS mendokumentasikan versi tertentu dari panggilan tersebut, yaitu perilaku daging panggang untuk versi Rakudo dalam Rakudo Star terbaru; dan MUNGKIN perilaku dokumen di versi lain.
Aiui, konsensus saat ini dan / atau praktik kerja adalah bahwa apa yang beberapa orang mungkin anggap sebagai kontribusi dokumen "lemah", misalnya beberapa konten singkat, dan / atau tautan di luar dokumen, MUNGKIN diperkenalkan jika sukarelawan merasakan perubahan segera dijamin untuk mencerminkan beberapa kekhawatiran yang dikemukakan oleh pengguna (mis. SO ini) dan bahwa membuat perubahan "lemah" akan lebih baik daripada tidak melakukan apa-apa sama sekali. Anda tentu saja dapat melakukan PR untuk memperbaikinya (atau mengembalikannya jika Anda benar-benar merasa bahwa perubahan itu "sangat lemah" sehingga memperburuk keadaan).
(Itu adalah hal seperti itu menurut hitungan saya juga, meskipun saya telah melihat kompiler mengklaim 2019.03.1 dengan istirahat yang sama dalam perilaku. [3] )
Saya pikir JJ membuat perubahan dokumen dan dia hanya salah mengartikan komentar jnthn tentang bagaimana beradaptasi dengan perubahan. Saat ini saya pikir ini lebih baik daripada tidak sama sekali tetapi berharap Anda memperbaruinya. :)
Catatan kaki
[1] Berikut ini dikatakan beberapa menit setelah Larry pertama kali mengumumkan proyek yang mengarah ke Raku dalam pidatonya "State of the Onion" tahun 2000 :
[2] Tentu saja, panggang hanya berfungsi dengan baik untuk pengguna tertentu jika pengujiannya cukup untuk memenuhi kebutuhan pengguna. Masalah Arne menunjukkan bagaimana lubang dalam liputan bisa mengejutkan. Untuk diskusi tentang lubang-lubang ini saat mereka berdiri pada 2018, lihat Spesifikasi, Versi, Perubahan, dan ... Kerusakan . Berita baiknya adalah panggang hanya banyak unit test yang ditulis dalam Raku untuk menguji bahwa ekspresi atau konstruksi dengan nilai tertentu melakukan hal tertentu. Jadi mudah bagi individu atau perusahaan untuk berkontribusi tes baru untuk meningkatkan cakupan tes. Dan semuanya berada di bawah kontrol versi (git), jadi tag hilir khusus, cabang, dan garpu layak, berkelanjutan, dan dikelola. (Memang, itu bagaimana baru versi bahasa (
Christmas
,Diwali
,Eid
(?), Dll) dikelola.)[3] Saya telah melihat upaya untuk me-rebest sebuah kelas baru yang dibuat menggunakan
newclass is oldclass
sintaks biasa, keduanya berfungsi (pada laptop saya) dan tidak berfungsi (pada repl.it) menggunakan kompiler yang mengklaim dirinya sebagai2019.03.1
. (Presumbly repl.it menginstal versi dari kode sumber kompilator, atau biner disusun dari itu, diambil dari kepala sekolah lama setelah versi compiler telah diupdate untuk2019.03.1
, dengan perubahan melanggar di tempat. Saya perhatikan bahwa repl.it haven' t mempublikasikan raku online mereka - saya menemukannya secara tidak sengaja - jadi tidak ada yang tidak diinginkan tentang situasi ini tetapi itu menguatkan bagi saya perlunya$RAKU.compiler.verbose-config
metode yang digunakan dalam output yang bekerja / rusak yang baru saja saya tautkan.)sumber
Pertanyaan tindak lanjut: Lihat Raku rebless dan beberapa kelas
sumber