- Raku dipertimbangkan sebagai kandidat bahasa kalkulator untuk menutup celah dalam pekerjaan matematika yang ditinggalkan Python, J, Frink, dan Excel, dan hanya dari eksperimen singkat pun memberi kesan sebagai bahasa yang sangat kuat tetapi ganjil
- Raku memiliki ekspresivitas yang berpusat pada operator yang luas, seperti simbol Unicode, operator infiks alfanumerik, perkalian daftar·zip·reduce·akumulasi, matcher
~~, dan sekuens... - Pengguna bukan hanya bisa mendefinisikan operator infiks, tetapi juga operator circumfix/postcircumfix, dan bahkan dapat menentukan asosiativitas bukan cuma kiri·kanan, melainkan juga chain·list
- Multiple dispatch bercabang bukan hanya lewat signature tipe, tetapi juga lewat predikat runtime
where, dan signature fungsi serta parameter di dalamnya juga bisa diperlakukan sebagai nilai kelas satu - Ini tampak membebani untuk pemeliharaan codebase besar, tetapi tetap menarik untuk pemrograman skala kecil seperti skrip sekali pakai, perhitungan, dan alat pribadi; hambatan utamanya adalah dokumentasi, REPL Windows, kecepatan kompilasi, dan kesalahan sigil
Alasan melihat Raku dan kesan pertama
- Raku adalah bahasa yang dulu dikenal sebagai Perl 6
- Setelah menulis keluhan tentang bahasa dinamis, beberapa pengguna merekomendasikan Raku, dan saya lalu memeriksanya untuk melihat apakah cocok sebagai bahasa kalkulator untuk pekerjaan matematika
- Sebelumnya saya mencampur Python, J, Frink, dan Excel, tetapi masing-masing punya kelemahan besar
- Kesan yang saya dapat setelah beberapa hari bereksperimen kurang lebih seperti “bahasa yang dirancang oleh gremlin yang benar-benar cerdas, setelah mengumpulkan banyak masukan dari gremlin lain”
Sistem operator yang tidak biasa
- Raku sangat aktif menggunakan operator Unicode
- Keanggotaan himpunan diperiksa dengan
∈ - Ada juga
∉,∋, dan∌
- Keanggotaan himpunan diperiksa dengan
- Operator infiks alfanumerik juga diperbolehkan
- Operator pengulangan string adalah
x - Komposisi fungsi adalah
o
- Operator pengulangan string adalah
- Kombinasi daftar juga dinyatakan dengan simbol singkat
Xmembuat perkalian Kartesius dari daftarXfmenerapkanfke setiap elemen dari perkalian KartesiusZfmelakukan hal yang sama dengan cara zip
- Untuk operator infiks
f,[f]melakukan reduce pada daftar, dan[\\f]membuat hasil akumulasi[+] <1 2 3 4 5>adalah15[\\+] <1 2 3 4 5>adalah(1 3 6 10 15)
Matcher ~~ dan sekuens ...
~~dipakai sebagai matcher yang menangani berbagai jenis perbandingan dalam satu sintaks"abc" ~~ "abc"memeriksa kecocokan string"abc" ~~ Strmemeriksa apakah itu bertipe string"abc" ~~ {.chars == 3}memeriksa apakah panjangnya 3"abc" ~~ /^b/memeriksa apakahabcdimulai denganb
...menangkap pola dari nilai-nilai sebelumnya untuk membuat sekuens0,1,2...10bertambah 1 dari0sampai100,2,4...10menjadi sekuens bilangan genap1,2,4...10mengikuti pola pertumbuhan seperti1 2 4 8
Operator yang didefinisikan pengguna
- Raku tidak berhenti pada kemampuan mendefinisikan operator infiks seperti beberapa bahasa lain, tetapi juga memungkinkan pembuatan operator circumfix dan postcircumfix
- Misalnya, operator pembungkus seperti
sub circumfix:<[∀ zz>($inner){sum($inner)}bisa didefinisikan untuk menjumlahkan nilai di dalamnya - Operator postcircumfix yang tampak seperti hasil kali titik vektor juga bisa didefinisikan
sub postcircumfix:<| ⟩>(@left, @inside){[+] (@left Z* @inside)}<1 2 3>|<4 5 6>⟩adalah32
- Asosiativitas operator juga bisa ditentukan dengan beragam cara
- Operator infiks kiri-asosiatif dan kanan-asosiatif yang umum bisa didefinisikan
- Bisa menetapkan chain associativity, di mana
x < y < zditafsirkan sepertix < y && y < z - List associativity juga didukung, sehingga
a op b op cmenjadiop(a, b, c)
Multiple dispatch dan percabangan kondisi runtime
- Raku mendukung multiple dispatch, memilih definisi fungsi yang tepat dari beberapa definisi dengan signature tipe berbeda
- Fungsi contoh
fberperilaku berbeda tergantung kombinasi argumennya- Jika menerima skalar dan array, ia menambahkan skalar ke setiap elemen array
- Kasus array dan skalar juga didukung
- Jika menerima dua array, ia menambahkan tiap elemen dengan
Z+
- Yang lebih aneh lagi, dispatch juga bisa dilakukan berdasarkan predikat runtime dari nilai
multi my_abs(Int $x where {$x > 0}) {$x}multi my_abs(Int $x) {-$x}
- Signature fungsi adalah nilai kelas satu, dan parameter di dalam signature juga merupakan nilai kelas satu
Permukaan luas yang dibentuk fitur-fitur kecil
- Jika mendefinisikan fungsi
MAIN, parameternya otomatis diubah menjadi flag CLI - Objek memiliki sangat banyak metode bawaan
- Objek List menyediakan metode untuk mendapatkan semua permutasi, semua kombinasi k, dan semua sliding window
- Junctions adalah bentuk nilai yang tidak biasa untuk melakukan beberapa perbandingan sekaligus
1|2diperluas menjadiany(1, 2)sehingga1 < 1|2bernilai benar1&2diperluas menjadiall(1, 2)sehingga1 !< 1&2bernilai benar
- Operator infiks apa pun bisa diberi awalan
!untuk menjadi operator negasi - Raku tampak seperti bahasa yang memiliki nama
$kebab-casesekaligus pengurangan infiks, dan sigil tampaknya membantu membedakanx-y - Sintaks regex tidak kompatibel ke belakang dengan Perl 5
- Selama 30 tahun banyak bahasa mengikuti “standar” PCRE, tetapi Perl 6 meninggalkannya
Wilayah yang belum dilihat dan daya tarik pada skala kecil
- Yang saya lihat sejauh ini hanyalah sebagian fitur yang berfokus pada penggunaan sebagai kalkulator
- Saya masih belum mempelajari sistem objek, paket, dan grammars
- Masih banyak fitur yang belum sempat dilihat, seperti
samewithdi badan fungsi yang tampak seperti memanggil ulang fungsi yang sama dengan argumen baru - Jika harus memelihara codebase Raku warisan, itu tampaknya akan sangat berat, tetapi untuk pemrograman In The Small Raku terlihat kuat
- skrip sekali pakai
- perhitungan
- alat pribadi
- jenis pekerjaan yang memang sejak awal saya inginkan
Keluhan dan harapan
- Dokumentasinya sangat kurang, dan ketergantungan pada simbol membuat pencarian jadi sulit
- Bahkan bagi orang yang sudah pernah mempelajari beberapa bahasa dengan dokumentasi minim, Raku jauh lebih besar dan kompleks sehingga bisa menurunkan motivasi
- Di Windows, memasukkan Unicode ke REPL menyebabkan crash
- Kompilernya juga cukup lambat; bahkan file kecil pun butuh lebih dari 0,5 detik, sehingga pekerjaan berulang terasa menyakitkan
- Sistem sigil terasa tidak nyaman
- Ada contoh menghabiskan 30 menit untuk debugging masalah karena menulis
$xalih-alih@x
- Ada contoh menghabiskan 30 menit untuk debugging masalah karena menulis
- Secara keseluruhan saya menyukai Raku dan berharap ia berhasil, tetapi saya juga berharap waktu kompilasi dan dokumentasinya membaik seiring waktu
1 komentar
Pendapat di Hacker News
Jika bahasa pemrograman ditempatkan dalam ruang dua dimensi, sumbunya bisa berupa seberapa mengejutkannya dan, saat terkejut, apakah itu menyenangkan/mengerikan
Secara implisit biasanya orang berharap bahasa yang waras berada di kiri bawah: “hampir tidak mengejutkan, tetapi kalau sesekali mengejutkan pun menyenangkan.” Raku terasa seperti secara terang-terangan mengincar kuadran kiri atas yang jarang terisi. Sikapnya lebih seperti, “Aneh, kan? Keren, bukan?”
document.write = function ..., dan itu menyenangkan karena berhasil melakukan yang dibutuhkan, tetapi pada saat yang sama cukup mengerikanPerl juga punya banyak “kejutan menyenangkan”, dan menurut saya Raku terutama dirancang untuk menghilangkan kejutan-kejutan mengerikan dari Perl
∈untuk memeriksa keanggotaan himpunan0,2,4...10menjadi(0 2 4 6 8 10), tetapi ketika1,2,4...10menjadi(1 2 4 8), rasanya seperti, “apakah ini mencari angka berikutnya di OEIS?”Raku menarik sebagai bahasa, tetapi beberapa idiom-nya sulit masuk ke kepala
Mirip dengan AppleScript yang terasa aneh karena berusaha terlihat seperti bahasa alami, Raku mencampur unsur bergaya bahasa alami seperti
my,say,sub,gatherdengan simbol seperti@, deklarasi modul, dan keputusan sintaks lain yang bagi orang luar tampak Bizantium. Contoh 99 bottles pun secara logis bisa diikuti, tetapi sulit ditemukan secara intuitif. Karena banyak simbol dan terasa dioverload tergantung konteks, bahkan untuk pekerjaan yang mungkin cocok bagi Raku, seperti parser bahasa alami, saya tidak terlalu ingin memakainya langsunghttps://examples.raku.org/categories/module-management/Fletc...
@untuk array, akan terlihat cukup familierFitur favorit saya di Raku adalah pembagian bilangan bulat dan literal desimal sama-sama mengembalikan
Rat, tipe bilangan rasionalSemua orang tahu floating-point itu kurang bagus, tetapi hampir tidak ada bahasa yang benar-benar berusaha menjauh darinya; di Raku, literal baru menjadi floating-point kalau memakai notasi ilmiah
Mereka punya hierarki angka yang mencakup bilangan rasional dan bahkan bilangan rasional kompleks, serta tentu saja mendukung angka presisi arbitrer. Kemungkinan komposisinya luar biasa
Ratmenjadi terlalu besar, otomatis berubah menjadi floating-point1/10adalahRat, tetapi1/100000000000000000000menjadiNum. Ada jugaFatRatyang tidak dipromosikan, tetapi itu bukan defaultJadi alih-alih mengatakan “sudah beralih dari cara memakai floating-point tidak eksak meski tidak diminta secara eksplisit”, lebih tepat mengatakan bahwa sejak awal ia memang tidak pernah berada dalam kondisi seperti itu
(/ 1.0 3.0)menjadi0.3333333333333333,(/ 1 3)menjadi1/3, dan(- (+ 0.1 0.2) 0.3)menjadi5.551115123125783e-17float()jauh lebih banyak daripadaDecimal()Kalau tidak langsung menangani uang, floating-point hampir selalu pilihan yang diinginkan
Saya tidak merasa dokumentasi Raku “benar-benar buruk”; justru situs dokumentasi resminya mengesankan karena menjadi sumber satu pintu yang memuat dokumentasi konsep dan dokumentasi API
https://docs.raku.org/
Sebagai titik awal untuk dokumentasi konsep, halaman ini sangat bagus: https://docs.raku.org/language
Sebagian besar konten yang ada ditulis dengan baik dan punya contoh kode yang berguna, tetapi kadang saya menemukan bagian yang sama sekali belum didokumentasikan atau hanya membahas kasus sederhana. Terutama sistem modul yang paling bermasalah, dan perbedaan modul/paket sulit dipahami hanya dengan membaca halaman Modules. Namespace yang diimpor dan namespace yang dideklarasikan bisa berbeda, tetapi agar compiler dapat menemukannya, struktur direktori harus cocok dengan namespace; hal itu berguna dan anehnya masuk akal, tetapi saya harus mempelajarinya dengan mencoba sendiri
Semua operator Unicode keren di Raku punya notasi alternatif ASCII
Misalnya, alternatif untuk
∈,∉,∋,∌adalah(elem),!(elem),(cont),!(cont)https://docs.raku.org/language/unicode_ascii#Other_acceptabl...
Kritik khas yang muncul sebelum orang benar-benar memahami bahasanya tampaknya masih terus diulang. Dulu Perl disebut “line noise”, sekarang Raku dianggap tanpa ragu memakai operator Unicode
Namun itu opsional, dan saya pernah mencobanya sendiri agar kode tampak ringkas dan ekspresif di layar. Ini cocok untuk penggunaan Unicode yang hati-hati dan kreatif. Reaksi tidak suka sigil juga umum, tetapi saya memakai Raku/Perl 6 karena menyukai ekspresivitas Perl yang seperti gergaji mesin Swiss Army, dan Raku terasa seperti Perl yang dikuadratkan dalam ke-Perl-annya. Lebih rapi dan ekspresif, dengan tumpukan besar fitur di atas Perl lama yang bagus. Dokumentasinya juga bagus, meski masih perlu terus dibenahi; dibandingkan dokumentasi Perl, standarnya memang sangat tinggi
Melakukan ini hanya untuk menghemat beberapa karakter terasa rumit dan tidak terlalu bermakna
Saya kadang bertanya-tanya seperti apa bahasa pemrograman yang penuh dengan syntax sugar; sekarang saya sudah tahu
Rasanya seperti “mengerikan tapi anehnya menarik, tidak bisa berhenti melihat, tunjukkan lagi”
Deskripsi GitHub-nya berbunyi “slaps roof of [programming language]* this bad boy can fit so much [syntax sugar] into it.” Ia juga menang di Advent of Code terbaru dengan memakai bahasa itu: https://github.com/betaveros/noulith
Patut diingat bahwa Raku awalnya dimulai sebagai Perl 6, dan banyak filosofi desainnya berasal dari cara berpikir ala Perl
Melihat penulis langsung bereaksi terhadap operator
xuntuk pengulangan string, sepertinya ia tidak terlalu mengetahui sejarah Perl dan Raku; padahal itu sudah seperti itu di Perl selama puluhan tahunBukan tanpa alasan ia disebut Perl 6, dan ia dikembangkan oleh tim Perl yang hampir sama. Kalau seseorang cukup banyak memakai Perl 5, warisan Perl6/Raku terlihat jelas. Seluruh model objek Raku juga lebih mirip versi yang sedikit lebih kuat dari Moose.pm, modul Perl 5 di CPAN
Sejujurnya, sintaks regex Perl 5/PCRE itu mengerikan
Alasan keberadaannya hanya karena dalam sintaks regex lama
(?adalah kesalahan sintaks, sehingga bisa didefinisikan ulang untuk makna apa pun. Raku adalah upaya merancang bahasa regex yang waras dari awal, sekarang setelah kita tahu apa yang seharusnya diekspresikan oleh regex. Alternatifnya adalah terjebak 30 tahun lagi dengan hal-hal seperti(?:this|(?>or that))Sudah lama saya tidak menyentuh Perl, tetapi regex masih sering saya pakai
Dalam arti tertentu, ini jelas gremlin. Saya suka alat yang aneh dan kompleks tetapi meningkatkan produktivitas
Namun saya tidak setuju dengan perbandingan “program besar vs program kecil”. Orang yang kurang bijak bisa menafsirkannya sebagai berarti ini bahasa yang buruk untuk pekerjaan besar, padahal sebenarnya bisa sama baiknya atau bahkan lebih baik daripada bahasa lain. Masalahnya, seperti bahasa gremlin lainnya, Anda butuh kebijaksanaan agar bisa memakainya dengan baik. Misalnya, hampir tidak ada orang yang cukup pernah memakai bahasa serupa akan bingung antara
$xdan@x. Sigil justru membuat membaca kode lebih mudah karena langsung memberi tahu tipe sederhana variabel—di Raku, antarmukanya—dan namespace variabel yang sama bisa dipakai secara berguna dengan sigil berbeda. Kelihatannya aneh, tampak seperti karakter yang tidak perlu, dan maknanya harus dipahami, tetapi bisa membuat hidup lebih mudah: https://www.perl.com/article/on-sigils/Masalah muncul pada orang-orang yang tidak benar-benar tahu apa yang mereka lakukan. Bagi mereka, bahasa gremlin ini bisa menjadi mimpi buruk hidup, dan mereka membutuhkan banyak perangkat pelindung seperti bumper boling, pelampung, sarung tangan Kevlar, helm, dan GPS. Ini bukan berarti gedung pencakar langit tidak bisa dibangun dengan bahasa gremlin; yang tidak bisa membangunnya adalah non-gremlin yang mudah membuat kecelakaan, sedangkan gremlin yang bijak bisa
Alat ada untuk membantu tim melakukan hal yang dibutuhkan dengan lebih baik atau lebih cepat. Jika Anda memakai alat yang rumit secara tidak perlu untuk menyaring junior atau memuaskan ego sendiri, alat itu lebih mirip senjata terhadap anggota organisasi lain daripada bantuan