- Bahasa kecil yang berjalan di atas runtime Go sambil menggunakan sintaks bergaya Rust, menggabungkan keunggulan kedua bahasa
- Struktur yang memperkuat keamanan dan daya ekspresif melalui algebraic data type, pattern matching, sistem tipe Hindley-Milner, dan immutability secara default
- Menjamin interoperabilitas dengan ekosistem Go melalui import langsung paket Go, operator pipeline, blok try, dan konkurensi berbasis task
- Meningkatkan pengalaman pengembang dan stabilitas kode dengan deteksi kesalahan saat compile time, pesan diagnostik yang jelas, dan dukungan LSP
- Poin utamanya adalah kode Lisette diubah menjadi kode Go yang jelas dan mudah dibaca, sehingga bisa terintegrasi secara alami dengan proyek Go yang sudah ada
Gambaran umum Lisette
- Lisette adalah bahasa kecil berbasis sintaks Rust yang dikompilasi ke runtime Go
- Memiliki karakteristik seperti algebraic data type, pattern matching, tanpa nil, sistem tipe Hindley-Milner, immutability secara default, dan interoperabilitas dengan ekosistem Go
- Dapat diinstal dengan perintah
cargo install lisette, dan bisa langsung mengimpor serta menggunakan paket Go sepertifmt,io,os
Sintaks yang familier
- Memiliki struktur sintaks yang mirip Rust
- Mendukung pattern matching melalui
enumdanmatch - Definisi method dimungkinkan dengan blok
structdanimpl
- Mendukung pattern matching melalui
- Sebagai bahasa yang berorientasi ekspresi,
if,let, dan blok semuanya mengembalikan nilai - Mendukung chaining dan lambda sehingga pemrosesan environment variable atau manipulasi string bisa ditulis dengan ringkas
- Mendukung interface dan generic, dan memungkinkan penulisan fungsi generik melalui definisi
interfaceserta constraintT: Trait - Tipe
Optiondapat ditangani secara ringkas dengan sintaks if let dan let else
Keamanan
-
Mendeteksi kesalahan yang dapat terjadi di runtime Go saat compile time
- Jika tidak semua pola ditangani dalam pernyataan
match, akan muncul error niltidak bisa digunakan, nilai yang hilang direpresentasikan dengan Option<T>- Jika nilai kembalian Result diabaikan, akan muncul peringatan
- Muncul peringatan jika tipe privat diekspos dalam API publik
- Akan terjadi error jika variabel immutable diteruskan sebagai argumen yang bisa diubah
- Jika field struct terlewat, akan terjadi compile error
- Pesan diagnostik menyertakan lokasi kode yang spesifik dan saran perbaikan
- Dapat digunakan di editor utama seperti VSCode, Neovim, dan Zed dengan dukungan LSP(Language Server Protocol)
- Jika tidak semua pola ditangani dalam pernyataan
Kegunaan
- Dirancang dengan fokus pada interoperabilitas dengan Go
- Operator pipeline(
|>) memungkinkan chaining fungsi ditulis dengan ringkas - Blok try menyederhanakan propagasi error
- Konkurensi diimplementasikan menggunakan
taskdanChannel, mirip dengan goroutine di Go - Dengan atribut serialisasi, nama field JSON, penghilangan field, konversi string, dan tag validasi dapat ditentukan
- Menyediakan blok
recoveruntuk pemulihan panic, dan penanganan error yang aman dengan tipeResult - Mendukung sintaks
deferuntuk menjamin pembersihan resource atau rollback transaksi
Hasil kompilasi yang transparan
- Kode Lisette diubah menjadi kode Go yang jelas dan mudah dibaca
- Tipe
OptiondanResultmasing-masing diubah menjadi structlisette.Optiondanlisette.Result - Sintaks
matchdiubah menjadi pernyataan kondisional Go untuk menangani tiap cabang - Operator
?secara internal diganti dengan kode pemeriksaanResult
- Tipe
- Sebagai contoh, fungsi
classifymenerimaOption<int>lalu diubah menjadi pernyataan kondisional eksplisit di Go, sedangkan fungsicombinediubah menjadi kode Go yang memeriksaResult
Informasi tambahan
- Repositori resmi: github.com/ivov/lisette
- Dirilis dengan lisensi MIT, dan pada 2026 dikembangkan oleh Iván Ovejero
1 komentar
Komentar Hacker News
Saya sempat berbincang dengan pembuatnya dan meski belum mencoba bahasanya secara langsung, Lisette tampak menarik dan jelas merupakan perbaikan dibanding Go
Meski begitu, saya rasa sulit untuk sepenuhnya mengatasi keterbatasan Go. Misalnya, masalah
typed nilyang berasal dari tipe interface di Go ditangani dengan Option di Lisette, tetapi unwrapping ganda (Some(Some(h))) bisa terasa canggungSelain itu, pendekatan defer di Go tetap tidak nyaman, dan tidak menyediakan pelepasan resource otomatis seperti RAII
Alasan TypeScript melengkapi JavaScript adalah karena tidak ada alternatif yang bisa dijalankan di browser, tetapi sekarang situasinya berbeda karena ada WASM
Jadi muncul pertanyaan, “kalau sudah ada Rust, kenapa membuat Go menjadi seperti Rust?” Meski begitu, Lisette tampaknya membidik titik tengah di antaranya
Pada akhirnya, Lisette terlihat cocok untuk orang yang ingin memperbaiki codebase Go yang sudah ada atau tetap ingin memakai runtime Go
Yang membuat saya penasaran adalah tidak adanya panduan mulai cepat untuk pertanyaan “bagaimana cara mulai menulis file berikut ini dengan Lisette alih-alih Go”
Tulisan blog terkait: Go is still not good
Di domain masalah yang menangani grafik referensi kompleks, GC itu esensial, dan berkat struktur stack mode pengguna di Go, ia punya model memori yang efisien
Go juga cocok untuk membuat alat CLI cepat seperti ini — contoh: wordle-tui
Sintaksnya sederhana, dukungan lintas platform bagus, runtime dan GC sudah tertanam, ada pola “errors as values”, green thread, kompiler AOT yang cepat, dan banyak keunggulan lain
deferdi Go memang berguna, tetapi penanganan error dan aturan scope terasa canggungTypeScript juga gagal menyelesaikan masalah ini, malah lebih buruk. Karena itu saya membuat sendiri paket tipe Option dan mengunggahnya ke NPM → fp-sdk
Sudah ada beberapa bahasa yang dikompilasi ke Go — XGo, Borgo, Soppo, dan lainnya
(T, error)menjadi tipe Result, tetapi secara makna keduanya tidak sepenuhnya samaMisalnya,
io.Reader.Readmemakai(n!=0, io.EOF)untuk menandakan akhir normal, jadi kalau diperlakukan begitu saja sebagai error, perilakunya akan jadi salahKualitas pesan error di Lisette sangat mengesankan. Petunjuk “help”-nya terasa benar-benar berguna
Namun, karena kode yang diubah ke Go bisa menjadi verbose, saya khawatir saat error runtime terjadi kita harus melakukan debugging di kode Go
Selain itu, arah memanggil Lisette dari kode Go yang sudah ada tampak sulit
Saya juga penasaran apakah Lisette adalah bahasa eksperimental atau memang ditujukan untuk produksi nyata
lis run --debug, komentar//line source.lis:21:5akan disisipkan ke kode Go sehingga stack trace dipetakan ke kode Lisette asliLSP menangani error waktu kompilasi berdasarkan file
.lisSaat ini belum ada fitur memanggil Lisette dari Go, tetapi prioritasnya adalah mengimpor paket Go dari Lisette
Awalnya ini hanya eksperimen, tetapi tujuannya adalah mengembangkannya menjadi bahasa tingkat produksi
Saya penasaran kenapa sintaks yang mirip Rust tidak diambil apa adanya
Contoh: memakai
use foo::baralih-alihimport "foo.bar", atauBar::Baz =>alih-alihBar.Baz =>Orang yang tahu Rust bisa bingung, dan yang tidak tahu Rust juga tidak mendapat transfer pengetahuan ke Rust
intdanfloat64mengikuti konvensi penamaan tipe milik Go.alih-alih+Runtime Go itu bagus, tetapi bahasanya sendiri terasa kasar dan tampaknya tidak punya keinginan untuk berkembang
Jadi kalau sampai memakai transpiler, sepertinya memang harus benar-benar tidak suka Go
Saya penasaran kenapa Rust atau bahasa keluarga Rust memisahkan struct dan method
Kenapa method tidak bisa didefinisikan langsung di dalam struct
Selain itu, blok impl bisa punya constraint generic yang berbeda dari struct-nya, jadi bisa didefinisikan lebih dari satu
Terakhir, Rust adalah bahasa yang dirancang agar orang berpikir dengan berpusat pada bentuk (shape) data
Kalau ada bahasa yang terlihat seperti Python tetapi dikompilasi ke Rust atau Go, itu akan sangat keren
Lisette tampak seperti bahasa yang berhasil menyeimbangkan kesederhanaan Go dan kompleksitas Rust
Saya penasaran apakah ada alasan kenapa kecepatan kompilasinya harus jauh lebih lambat daripada Go, dan bagian mana dari fitur Rust yang sengaja dikecualikan
Contohnya: borrow checking, tipe data, async, dan sebagainya
Go adalah bahasa yang mudah dipelajari, tetapi fiturnya kurang
Lisette tampak menarik karena menjadi bahasa yang mengisi celah itu
Seperti TypeScript memperluas JavaScript, kalau Go diberi sistem tipe yang lebih ekspresif dan kompiler yang lebih ketat, ia bisa menjadi bahasa backend yang hebat
Saran pribadi saya adalah mendukung berbagi tipe dengan frontend TypeScript. Ini salah satu alasan TypeScript populer juga di backend
Sebagai pengembang otomatisasi infrastruktur yang bimbang antara keamanan Rust dan kesederhanaan Go, ide menghadirkan kemudahan penggunaan Rust di atas runtime Go terasa sangat menarik
Saya akan terus mengikuti perkembangan proyek ini