- Rust tarzı sözdizimi kullanırken Go çalışma zamanı üzerinde çalışan küçük bir dil; iki dilin avantajlarını bir araya getiriyor
- Cebirsel veri tipleri, örüntü eşleme, Hindley-Milner tip sistemi, varsayılan değişmezlik gibi özelliklerle güvenlik ve ifade gücü artırılmış bir yapı sunuyor
- Go paketlerini doğrudan import etme, pipeline operatörü, try blokları, task tabanlı eşzamanlılık ile Go ekosistemiyle birlikte çalışabilirlik sağlıyor
- Derleme zamanında hata tespiti, açık tanı mesajları, LSP desteği ile geliştirici deneyimi ve kod güvenilirliği iyileşiyor
- En önemli nokta, Lisette kodunun okunması kolay Go koduna dönüştürülmesi ve böylece mevcut Go projeleriyle doğal biçimde entegre edilebilmesi
Lisette genel bakış
- Lisette, Rust sözdizimini temel alan ve Go çalışma zamanına derlenen küçük bir dil
- Cebirsel veri tipleri, örüntü eşleme, nil olmaması, Hindley-Milner tip sistemi, varsayılan değişmezlik, Go ekosistemiyle birlikte çalışabilirlik gibi özelliklere sahip
cargo install lisettekomutuyla kurulabiliyor; ayrıca Go'nunfmt,io,osgibi paketleri doğrudan import edilerek kullanılabiliyor
Tanıdık sözdizimi
- Rust'a benzer bir sözdizimsel yapı sunuyor
enumvematchile örüntü eşleme desteği sağlıyorstructveimplbloklarıyla metot tanımı yapılabiliyor
- İfade odaklı bir dil olarak
if,let, bloklar gibi yapıların tümü değer döndürüyor - Chaining ve lambda desteği sayesinde ortam değişkeni işleme veya string manipülasyonu kısa ve net biçimde ifade edilebiliyor
- Arayüzler ve generics destekleniyor;
interfacetanımı veT: Traitkısıtlarıyla generic fonksiyonlar yazılabiliyor - if let ve let else sözdizimiyle
Optiontipi kısa ve anlaşılır biçimde ele alınabiliyor
Güvenlik
-
Go çalışma zamanında ortaya çıkabilecek hataları derleme zamanında tespit eder
matchifadesinde tüm örüntüler ele alınmazsa hata oluşurnilkullanılamaz, eksik değerler Option<T> ile ifade edilir- Result dönüş değerleri yok sayılırsa uyarı verilir
- Özel tiplerin açık API'de dışa vurulması durumunda uyarı oluşur
- Değişmez değişkenin değiştirilebilir argüman olarak geçirilmesi hata üretir
- Struct alanı eksikse derleme hatası oluşur
- Tanı mesajları, somut kod konumu ve düzeltme önerileri ile birlikte sunulur
- LSP(Language Server Protocol) desteği sayesinde VSCode, Neovim, Zed gibi başlıca editörlerde kullanılabilir
Kullanılabilirlik
- Tasarımın odağında Go ile birlikte çalışabilirlik bulunuyor
- Pipeline operatörü(
|>) ile fonksiyon zincirleme daha kısa ifade ediliyor - try blokları, hata yayılımını basitleştiriyor
- Eşzamanlılık,
taskveChannelkullanılarak Go'nun goroutine yapısına benzer şekilde uygulanıyor - Serileştirme attribute'ları ile JSON alan adı, atlama, string dönüşümü, doğrulama etiketleri gibi ayarlar yapılabiliyor
panickurtarması içinrecoverbloğu sunuluyor ve Result tipiyle güvenli hata yönetimi sağlanabiliyor- defer sözdizimi desteklenerek kaynak temizliği veya transaction rollback garanti altına alınabiliyor
Şeffaf derleme çıktısı
- Lisette kodu, açık ve okunması kolay Go koduna dönüştürülür
OptionveResulttipleri sırasıylalisette.Optionvelisette.Resultstruct'larına dönüştürülürmatchsözdizimi, Go'nun koşul ifadelerine çevrilerek her dal işlenir?operatörü, iç taraftaResultkontrol koduna dönüştürülür
- Örneğin
classifyfonksiyonuOption<int>alır ve Go'da açık koşul ifadelerine dönüştürülür;combinefonksiyonu iseResultkontrolü yapan Go koduna çevrilir
Ek bilgiler
- Resmi depo: github.com/ivov/lisette
- MIT lisansı ile yayımlanmış olup, 2026 itibarıyla Iván Ovejero tarafından geliştiriliyor
1 yorum
Hacker News görüşleri
Yazarla konuşma fırsatım oldu ve dili bizzat denememiş olsam da Lisette ilgi çekici ve Go’ya kıyasla açıkça iyileştirilmiş bir dil gibi görünüyor
Yine de Go’nun sınırlamalarını tamamen aşmanın zor olduğunu düşünüyorum. Örneğin, Go’nun arayüz tiplerinden kaynaklanan
typed nilsorunu Lisette’te Option ile ele alınıyor, ancak çift açma (Some(Some(h))) garip hale gelebilirAyrıca Go’nun defer yaklaşımı hâlâ rahatsız edici ve RAII gibi otomatik kaynak serbest bırakma sağlamıyor
TypeScript’in JavaScript’i tamamlayabilmesinin nedeni, tarayıcıda çalışabilecek bir alternatifin olmamasıydı; artık WASM var, dolayısıyla durum farklı
Bu yüzden “Rust varken neden Go’yu Rust gibi yapalım?” sorusu akla geliyor. Yine de Lisette sanki bu ikisinin arasındaki noktayı hedefliyor
Sonuç olarak Lisette, mevcut Go kod tabanlarını iyileştirmek veya Go runtime’ını kullanmaya devam etmek isteyenler için uygun bir dil gibi görünüyor
Benim merak ettiğim şey, “Şu dosyayı Go yerine Lisette ile yazmaya başlamak istesem nasıl başlarım?” sorusuna yanıt veren bir hızlı başlangıç rehberinin olmaması
İlgili blog yazısı: Go is still not good
Karmaşık referans grafiklerini ele alan problem alanlarında GC zorunlu ve Go’nun kullanıcı modu stack yapısı sayesinde verimli bir bellek modeline sahip
Go, böyle hızlı CLI araçları geliştirmek için de uygun — örn: wordle-tui
Söz dizimi basit, çapraz platform desteği var, runtime ve GC gömülü geliyor, “errors as values” yapısı, green thread’ler, hızlı AOT derleyicisi gibi pek çok avantaj sunuyor
Go’nun
deferözelliği kullanışlı olsa da hata işleme ve scope kuralları garipTypeScript de bu sorunu çözemedi, hatta daha da kötü. Bu yüzden kendim bir Option type paketi yapıp NPM’e koydum → fp-sdk
Go’ya derlenen diller zaten birkaç tane var — XGo, Borgo, Soppo vb.
(T, error)dönüşünü basitçe Result tipi ile değiştiriyor, ancak bu anlamsal olarak tamamen aynı değilÖrneğin
io.Reader.Readiçin(n!=0, io.EOF)normal sonlanma anlamına gelir; bunu basitçe hata diye ele almak yanlış davranışa yol açarLisette’in hata mesajı kalitesi etkileyici. “help” ipuçları gerçekten faydalı hissettiriyor
Ancak Go’ya dönüştürülen kodun çok ayrıntılı ve uzun olabilmesi nedeniyle, runtime hatası olduğunda Go kodunda debug yapmak gerekmesi endişe verici
Ayrıca mevcut Go kodundan Lisette’i çağırma yönü zor görünüyor
Lisette’in deneysel bir dil mi olduğu, yoksa gerçekten production’ı mı hedeflediği merak konusu
lis run --debugseçeneği kullanıldığında Go koduna//line source.lis:21:5yorumları ekleniyor ve stack trace özgün Lisette koduna eşleniyorLSP, derleme zamanı hatalarını
.lisdosyaları üzerinden işliyorŞu anda Go’dan Lisette çağırma özelliği yok, ancak öncelik Lisette içinden Go paketlerini import etme desteğinde
Başlangıçta bir deneydi ama hedef bunu production seviyesinde bir dil haline getirmek
Rust’a benzer söz dizimi neden doğrudan alınmamış, bunu merak ediyorum
Örn:
import "foo.bar"yerineuse foo::bar,Bar.Baz =>yerineBar::Baz =>gibiRust bilenler için kafa karıştırıcı oluyor, bilmeyenler içinse Rust bilgisine aktarım sağlamıyor
intvefloat64, Go’nun tip adlandırma kurallarını takip ediyor+yerine.kullanmak gerektiğini sık sık unutuyorumGo runtime’ı iyi ama dilin kendisi kaba ve gelişmeye pek niyeti yokmuş gibi duruyor
Bu yüzden transpiler kullanacak kadar ileri gidiliyorsa, gerçekten Go’dan nefret ediliyor olmalı
Rust ve Rust benzeri dillerin struct ile method’u ayırmasının nedeni ne, bunu merak ediyorum
Neden method’ları doğrudan struct içinde tanımlayamıyoruz?
Ayrıca impl blokları, struct’tan farklı generic kısıtlar taşıyabildiğinden birden fazla tane tanımlanabiliyor
Son olarak Rust, verinin şekli (Shape) etrafında düşünmeye yönelten bir dil olarak tasarlanmış
Python gibi görünen ama Rust’a veya Go’ya derlenen bir dil olsa gerçekten harika olurdu
Lisette, Go’nun sadeliği ile Rust’ın karmaşıklığı arasında iyi bir denge kuran bir dil gibi görünüyor
Derleme hızının neden Go’dan çok daha yavaş olması gerektiğini ve Rust özelliklerinden hangilerinin bilinçli olarak dışarıda bırakıldığını merak ediyorum
Örn: borrow checking, veri tipleri, async vb.
Go öğrenmesi kolay ama özellikleri eksik bir dil
Lisette bu boşluğu dolduran bir dil gibi göründüğü için ilgi çekici
TypeScript’in JavaScript’i genişletmesi gibi, Go’ya ifade gücü yüksek bir tip sistemi ve katı bir derleyici eklenirse harika bir backend dili olabilir
Benim kişisel önerim, TypeScript frontend ile tip paylaşımını desteklemesi olurdu. TypeScript’in backend’de de popüler olmasının nedenlerinden biri bu
Rust’ın güvenliği ile Go’nun sadeliği arasında kararsız kalan bir altyapı otomasyonu geliştiricisi olarak, Rust’ın kullanılabilirliğini Go runtime’ı üzerine koyma fikri bana çok çekici geliyor
Projenin gelişimini izlemeye devam edeceğim