- Hurl adalah bahasa pemrograman eksperimental yang menyusun alur kontrol hanya dengan penanganan pengecualian, alih-alih percabangan atau perulangan biasa
- Hurl bermula dari percakapan antara Nicole Tietz-Sokolskaya dan teman-temannya di Recurse Center, dan situsnya menyediakan dokumentasi penggunaan, contoh, panduan debugging, serta tanya jawab
- Testimoni di halaman pengantar sengaja menonjolkan nuansa bercanda, dengan kutipan seperti “monstrosity is beautiful” dan “Certified unhinged™”
- Hurl dan kode sumber situsnya dibuka untuk publik, tetapi untuk mengirim patch lewat email diperlukan pengalihan hak atas patch
- Lisensinya ditawarkan dengan skema memilih salah satu dari AGPL-3.0, GAL-1.0, atau lisensi komersial
Eksperimen bahasa yang hanya menyisakan penanganan pengecualian
- Hurl dibuat untuk satu tujuan: mengeksplorasi apakah mungkin ada bahasa yang tersusun hanya dari alur kontrol berbasis penanganan pengecualian
- Ide ini muncul dari percakapan antara Nicole Tietz-Sokolskaya dan teman-temannya di Recurse Center, dan identitas teman-teman tersebut tidak diungkap “demi martabat”
- Situs ini menyediakan dokumentasi penggunaan Hurl, contoh, panduan debugging, dan tanya jawab
Terlihat seperti lelucon, tetapi benar-benar proyek yang dirilis
- Halaman pengantar memuat testimoni yang menunjukkan karakter Hurl
- “This monstrosity is beautiful, and I must never touch it”
- “Certified unhinged™!”
- “is "🤮" an available quote?”
- Jika ingin memuat testimoni tambahan, Anda harus mengirim email ke Nicole, dan diperlukan persetujuan eksplisit untuk menyertakan kutipan
Kode sumber dan ketentuan lisensi
- Bahasa Hurl dan kode sumber situs ini dipublikasikan di repo Hurl
- Jika menemukan bug atau kesalahan, Anda dapat mengirim patch lewat email, tetapi harus menyerahkan semua hak atas patch tersebut
- Ini adalah syarat untuk mempertahankan kemungkinan relisensi dan lisensi komersial
- Proyek ini dapat digunakan dengan memilih salah satu dari tiga lisensi berikut
-
AGPL-3.0
- GAL-1.0: Gay Agenda License
- lisensi komersial
- Dalam proses peninjauan lisensi, joke licenses dan unfortunate licenses juga dipertimbangkan, tetapi akhirnya dipilih tiga lisensi di atas
-
1 komentar
Komentar Hacker News
Kalau merancang bahasa pemrograman, sebaiknya paksa namespace untuk include/import, dan kalau bisa cegah juga efek samping di level teratas
Lebih mudah disimpulkan kalau menerimanya seperti
let foo = include "lib/foo.hurl"lalu memanggilfoo.init()Sebaliknya, kalau setelah
include "lib/foo.hurl" // side effectsmunculbaz(buz), sulit tahu apakah fungsi dan variabel itu dari standard library atau di-include dari suatu tempatimport "foo/bar"semestinya membuatfoo.*ataubar.*bisa dipakai, bukan malahbazz.*. Langsung teringat GoVSCode juga bisa melakukan hal serupa dengan plugin dan LSP, tapi jauh lebih buruk. Navigasi kodenya terlalu lambat, jadi saya tidak bisa bekerja dengan VSCode
Saya penasaran apakah usulan seperti ini hanya berguna ketika alat semacam itu tidak ada. Setidaknya di lingkungan profesional, tampaknya mustahil hidup tanpa alat seperti itu
foo.init(), sesuatu yang mustahil dengan import polosBukan berarti proyek ini tidak bernilai; justru saya melihatnya sebagai karya seni
Saya pernah mem-fork Ruby dan membuat
requiretidak menimpa symbol table, tetapi ekosistem Ruby tampaknya terlalu bergantung pada shared global mutable state, sehingga akhirnya saya kehilangan minat pada Ruby itu sendiriException selalu terasa kurang bagus karena membuat kontrak antara caller dan callee sulit dipahami serta meningkatkan coupling kode
Saya lebih suka pendekatan seperti Go atau Rust yang menanganinya lewat nilai kembalian. Saat melihat sekilas bahasa ini, saya belum yakin apakah ada elemen yang menyelesaikan masalah tersebut
Model seperti ini mungkin baik-baik saja jika IDE bisa secara dinamis mengetahui semua exception yang tidak tertangkap dari sebuah fungsi, lalu memungkinkan lompat ke lokasi tempat exception dapat dilempar. Namun saya tidak tahu bagaimana coupling-nya ditangani, dan control-flow graph sepertinya akan menjadi sangat tidak stabil
Namun di Java, selama tidak mewarisi
RuntimeException, exception yang dapat dilempar fungsi adalah bagian dari signature fungsi. Jika melempar exception tanpa menambahkannya ke signature dalam kasus seperti itu, kodenya tidak akan dikompilasiKondisi di Java membuat IDE jauh lebih mudah melaporkan exception yang tidak tertangkap, tetapi untuk exception non-runtime ini adalah masalah yang bisa diselesaikan dengan analisis statis
Sebaliknya, pendekatan mengembalikan nilai terbungkus
Ok/Erryang distandardisasi tampaknya lebih sederhana baik dari sisi dukungan tooling maupun kenyamanan developerSatu-satunya perbedaan adalah pada mekanisme penerusan exception, Anda harus menulis sendiri kode boilerplate yang seharusnya bisa dilakukan compiler
Saya benar-benar tidak paham mengapa pada 2024 orang dengan kepala yang berfungsi normal ingin melakukannya secara manual
Selama saya menggunakannya, menemukan akar penyebab tanpa debugger jauh lebih menyakitkan
Contoh
tossdisebut “terutama dipakai untuk mengirim beberapa nilai ke luar fungsi, tidak benar-benar diperlukan tetapi lucu”, padahal jauh dari tidak berguna; itu mengimplementasikan generator yang dapat dilanjutkanTentu saja, akan cukup menarik jika dibuat melakukan hal lain selain langsung melanjutkan. Cukup susun seluruh codebase sebagai stack dalam-luar
tossreturnharus ber-scope secara leksikal ke handlerMisalnya di Python,
next()bisa dipanggil dari mana sajaIni lebih mirip meneruskan callback lewat kanal samping.
tossmemanggil callback itu, danreturnsecara harfiah kembali dari sanaRasanya agak seperti lelucon bahwa fitur yang benar-benar berguna di bahasa lain diperlakukan di sini seperti fitur lucu yang bisa dibuang
yielddi C#?Hurl terlihat cukup dekat dengan condition system ala Smalltalk atau Common Lisp
Stack unwinding dan resume hanyalah dua dari beberapa restart yang mungkin: https://gigamonkeys.com/book/beyond-exception-handling-condi...
Terlepas dari proyeknya sendiri, saya sangat yakin dunia akan menjadi lebih baik jika lebih banyak hal memakai ekstensi .wtf untuk domain
Ini terdengar seperti bentuk lemah dari algebraic effects, tetapi tetap keren melihat bahasa seperti ini dan apa yang bisa dilakukan dengannya
Jika algebraic effects pada dasarnya seperti kata kunci
tossdi Hurl, saya penasaran dalam hal apa ia lebih kuat daripadatossEksperimen pikiran yang menarik
Saya sangat tidak suka exception, dan menginginkan bahasa tanpa exception
Exception adalah
gotozaman kitaDengan adanya
Maybe/OptiondanEffect/Result, hampir tidak ada alasan untuk melempar exception lalu harus melacak di kepala di mana ia ditanganiSaya agak khawatir algebraic effects akan makin populer dan memengaruhi JS frontend yang sudah terlalu rumit, karena ia mendorong cara melempar “exception” untuk alur kontrol
Jika semua ini bertujuan menghindari masalah warna async/sync, bagi saya pribadi itu sama sekali tidak sepadan
Wah, saya tidak suka ini. Tapi anehnya ada sisi yang hampir elegan
Sangat sulit dimodelkan di kepala, tetapi tetap begitu
Sedikit lebih serius, saya berharap ada sintaks
catchyang berbeda untuk exception yang dapat dilanjutkan dan yang tidak dapat dilanjutkan. Dengan begitu ambiguitas sintaksis tentang apakahreturnmengembalikan alur kontrol ke sisi pelempar dari exception langsung terdekat atau tidak akan hilangDan standard library tidak boleh kabur ke fungsi yang mengembalikan nilai biasa. Jangan menolak memakan masakan sendiri hanya karena ternyata bikin mulas
Apakah pemahaman saya benar bahwa yang di-
hurlbisa ditangkap tetapi yang di-tosstidak bisa? Sepertinya perlu waktu untuk terbiasaSaya juga khawatir berapa banyak Hurl yang harus saya tulis sebelum orang mulai memanggil saya tosser
Tossterdengar seperti konstruksi bahasa yang menarik. Ia berjalan naik di stack untuk mencari exception handler, lalu kembali ke posisi semula dan melanjutkan eksekusi seolah tidak terjadi apa-apaDengan konstruksi ini, tampaknya perilaku tambahan bisa disuntikkan saat runtime
Dalam kode berorientasi objek biasanya dependency injection dilakukan lewat constructor service, tetapi apakah
tossmemungkinkan hal itu lewat “toss handler”?https://koka-lang.github.io/koka/doc/book.html#why-handlers
Saya tidak banyak tahu, tetapi saya tahu bahwa sistem seperti ini memungkinkan penyuntikan perilaku saat runtime
Resume Nextdi VB