1 poin oleh GN⁺ 2023-08-09 | 1 komentar | Bagikan ke WhatsApp
  • 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
  • Operator infiks alfanumerik juga diperbolehkan
    • Operator pengulangan string adalah x
    • Komposisi fungsi adalah o
  • Kombinasi daftar juga dinyatakan dengan simbol singkat
    • X membuat perkalian Kartesius dari daftar
    • Xf menerapkan f ke setiap elemen dari perkalian Kartesius
    • Zf melakukan 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> adalah 15
    • [\\+] <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" ~~ Str memeriksa apakah itu bertipe string
    • "abc" ~~ {.chars == 3} memeriksa apakah panjangnya 3
    • "abc" ~~ /^b/ memeriksa apakah abc dimulai dengan b
  • ... menangkap pola dari nilai-nilai sebelumnya untuk membuat sekuens
    • 0,1,2...10 bertambah 1 dari 0 sampai 10
    • 0,2,4...10 menjadi sekuens bilangan genap
    • 1,2,4...10 mengikuti pola pertumbuhan seperti 1 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>⟩ adalah 32
  • 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 < z ditafsirkan seperti x < y && y < z
    • List associativity juga didukung, sehingga a op b op c menjadi op(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 f berperilaku 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|2 diperluas menjadi any(1, 2) sehingga 1 < 1|2 bernilai benar
    • 1&2 diperluas menjadi all(1, 2) sehingga 1 !< 1&2 bernilai benar
  • Operator infiks apa pun bisa diberi awalan ! untuk menjadi operator negasi
  • Raku tampak seperti bahasa yang memiliki nama $kebab-case sekaligus pengurangan infiks, dan sigil tampaknya membantu membedakan x-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 samewith di 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 $x alih-alih @x
  • Secara keseluruhan saya menyukai Raku dan berharap ia berhasil, tetapi saya juga berharap waktu kompilasi dan dokumentasinya membaik seiring waktu

1 komentar

 
GN⁺ 2023-08-09
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?”

    • Masalahnya, sumbu-sumbu itu subjektif. Sesuatu bisa menyenangkan sekaligus mengerikan; dulu saya pernah menulis JavaScript seperti document.write = function ..., dan itu menyenangkan karena berhasil melakukan yang dibutuhkan, tetapi pada saat yang sama cukup mengerikan
    • Saat harus membuat parser untuk tugas kuliah, saya mengetahui fitur grammar Raku, dan karena fitur itu melakukan hampir semuanya untuk saya, rasanya seperti cheat code, tetapi tetap menyenangkan
    • Karena awalnya memang Perl 6, tidak mengherankan kalau para pengembang Perl menginginkan bahasa yang sama sekali tidak mirip bahasa lain
      Perl juga punya banyak “kejutan menyenangkan”, dan menurut saya Raku terutama dirancang untuk menghilangkan kejutan-kejutan mengerikan dari Perl
    • Saya paham maksudnya pada bagian yang memakai untuk memeriksa keanggotaan himpunan
      0,2,4...10 menjadi (0 2 4 6 8 10), tetapi ketika 1,2,4...10 menjadi (1 2 4 8), rasanya seperti, “apakah ini mencari angka berikutnya di OEIS?”
    • Semakin jauh paragrafnya, Raku terlihat makin bergerak ke kanan atas, yaitu wilayah yang mengejutkan dan mengerikan
  • 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, gather dengan 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 langsung
    https://examples.raku.org/categories/module-management/Fletc...

    • Sepertinya belum pernah memakai Perl. Dengan latar belakang Perl, banyak sintaks itu, terutama sigil @ untuk array, akan terlihat cukup familier
    • Saya merasakan hal yang sama saat melihat Bash
  • Fitur favorit saya di Raku adalah pembagian bilangan bulat dan literal desimal sama-sama mengembalikan Rat, tipe bilangan rasional
    Semua 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

    • Bahasa yang lebih tua seperti Common Lisp dan Scheme juga masih menunggu diapresiasi oleh orang-orang yang tidak suka floating-point IEEE 754
      Mereka punya hierarki angka yang mencakup bilangan rasional dan bahkan bilangan rasional kompleks, serta tentu saja mendukung angka presisi arbitrer. Kemungkinan komposisinya luar biasa
    • Ini sebenarnya lebih dekat ke fitur yang buruk. Sebab jika representasi Rat menjadi terlalu besar, otomatis berubah menjadi floating-point
      1/10 adalah Rat, tetapi 1/100000000000000000000 menjadi Num. Ada juga FatRat yang tidak dipromosikan, tetapi itu bukan default
    • Hierarki angka Scheme sudah menangani representasi eksak dengan benar selama puluhan tahun
      Jadi 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
    • Racket juga akan berkata lain. Itu bekerja dengan benar
      (/ 1.0 3.0) menjadi 0.3333333333333333, (/ 1 3) menjadi 1/3, dan (- (+ 0.1 0.2) 0.3) menjadi 5.551115123125783e-17
    • Saya tidak yakin ini bagus. Saya tahu kapan harus memakai tipe desimal/rasional dan kapan harus memakai floating-point, tetapi di kode Python pribadi saya, pemanggilan float() jauh lebih banyak daripada Decimal()
      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

    • Saya sudah memakai Raku selama beberapa tahun, dan dokumentasinya bagus sekaligus kurang
      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
    • Itu karena budaya Perl. FAQ Perl dan halaman manualnya berada di level tertinggi berkat karakter para programmer yang memakai Perl; cerdas, ringkas, dan nyeleneh
    • Halaman manual Perl selalu luar biasa
  • 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...

    • Kalau saya, jelas saya akan memakai versi ASCII
  • 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

    • Saya penasaran bagaimana operator non-ASCII itu diketik. Entah memakai tata letak keyboard khusus, editor yang otomatis mengubah urutan tertentu, atau escape Unicode mentah
      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”

    • Mungkin Anda akan menyukai bahasa hobi noulith, yang dibuat oleh orang yang memenangi beberapa Advent of Code belakangan ini
      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
    • Tunggu saja sampai Anda mengetahui Grammars di Raku
    • Saya bereaksi sama setiap kali melihat C++ modern
  • 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 x untuk pengulangan string, sepertinya ia tidak terlalu mengetahui sejarah Perl dan Raku; padahal itu sudah seperti itu di Perl selama puluhan tahun

    • Di tulisan utama ada kalimat “sintaks regex tidak kompatibel mundur dengan Perl 5. Selama 30 tahun bahasa-bahasa mengikuti ‘standar’ PCRE, tetapi Perl 6 begitu saja membuang semuanya”, jadi setidaknya tampaknya ia tahu sampai batas tertentu
    • Catatan kaki pertama menyebutkan bahwa Raku dulu dikenal sebagai Perl 6
    • Pernyataan “Perl6/Raku sama sekali berbeda dari Perl 5” terlalu dilebih-lebihkan
      Bukan 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))

    • Bukan sekadar mengerikan, melainkan sihir hitam yang tak terbaca; begitu dipahami, ia keren
      Sudah lama saya tidak menyentuh Perl, tetapi regex masih sering saya pakai
    • Setuju, tetapi memang benar-benar berguna
  • 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 $x dan @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

    • Pola pikir “alat ini hanya bisa dipakai oleh orang yang cukup jago” menurut saya adalah bau desain yang besar
      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