- Rust-स्टाइल सिंटैक्स का उपयोग करते हुए Go runtime पर चलने वाली एक छोटी भाषा, जो दोनों भाषाओं की खूबियों को जोड़ती है
- algebraic data types, pattern matching, Hindley-Milner type system, default immutability आदि के जरिए सुरक्षा और अभिव्यक्तिशीलता को मजबूत करने वाली संरचना
- Go packages का सीधा import, pipeline operator, try blocks, task-आधारित concurrency के माध्यम से Go ecosystem के साथ interoperability सुनिश्चित
- compile-time error detection, स्पष्ट diagnostic messages, LSP support से developer experience और code stability में सुधार
- Lisette code को पढ़ने में आसान Go code में बदला जाता है, जिससे मौजूदा Go projects के साथ स्वाभाविक रूप से integrate किया जा सकता है
Lisette अवलोकन
- Lisette एक छोटी भाषा है जो Rust सिंटैक्स पर आधारित है और Go runtime में compile होती है
- इसकी विशेषताओं में algebraic data types, pattern matching, nil का अभाव, Hindley-Milner type system, default immutability, और Go ecosystem के साथ interoperability शामिल हैं
- इसे
cargo install lisetteकमांड से install किया जा सकता है, और Go केfmt,io,osजैसे packages को सीधे import करके इस्तेमाल किया जा सकता है
परिचित सिंटैक्स
- इसमें Rust-जैसी सिंटैक्स संरचना है
enumऔरmatchके जरिए pattern matching का समर्थनstructऔरimplblocks के जरिए methods define किए जा सकते हैं
- यह एक expression-oriented language है, जिसमें
if,let, blocks आदि सभी value return करते हैं - chaining और lambda का समर्थन होने से environment variables हैंडल करना या string manipulation संक्षेप में व्यक्त किया जा सकता है
- interfaces और generics का समर्थन है, और
interfacedefinition तथाT: Traitconstraints के साथ generic functions लिखी जा सकती हैं - if let और let else syntax से
Optiontype को संक्षेप में handle किया जा सकता है
सुरक्षा
-
Go runtime में संभावित errors को compile time पर detect करना
matchstatement में यदि सभी patterns को handle नहीं किया गया हो तो error उत्पन्न होता हैnilका उपयोग संभव नहीं; missing values को Option<T> से दर्शाया जाता है- Result return value को ignore करने पर warning मिलती है
- private type को public API में expose करने पर warning मिलती है
- immutable variable को mutable argument के रूप में पास करने पर error होता है
- struct field छूटने पर compile error होता है
- diagnostic messages में सटीक code location और fix suggestions साथ में दिए जाते हैं
- LSP(Language Server Protocol) support के कारण इसे VSCode, Neovim, Zed जैसे प्रमुख editors में इस्तेमाल किया जा सकता है
उपयोगिता
- इसे Go के साथ interoperability पर खास ध्यान देकर डिजाइन किया गया है
- pipeline operator(
|>) से function chaining को संक्षेप में व्यक्त किया जा सकता है - try blocks के जरिए error propagation को सरल बनाया जा सकता है
- concurrency को
taskऔरChannelके जरिए Go के goroutine की तरह लागू किया गया है - serialization attributes से JSON field names, omission, string conversion, validation tags आदि निर्धारित किए जा सकते हैं
panicrecovery के लिएrecoverblock दिया गया है, औरResulttype के जरिए सुरक्षित error handling संभव हैdefersyntax का समर्थन है, जिससे resource cleanup या transaction rollback की गारंटी दी जा सकती है
पारदर्शी compile परिणाम
- Lisette code को स्पष्ट और पढ़ने में आसान Go code में बदला जाता है
OptionऔरResulttypes क्रमशःlisette.Optionऔरlisette.Resultstructs में बदल जाते हैंmatchsyntax को Go के conditional statements में बदलकर हर branch को handle किया जाता है?operator को अंदरूनी तौर परResultcheck code से प्रतिस्थापित किया जाता है
- उदाहरण के तौर पर,
classifyfunctionOption<int>लेता है और Go के explicit conditional statements में बदला जाता है, जबकिcombinefunctionResultकी जांच करने वाले Go code में परिवर्तित होता है
अतिरिक्त जानकारी
- आधिकारिक repository: github.com/ivov/lisette
- यह MIT license के तहत जारी है, और 2026 के अनुसार Iván Ovejero द्वारा विकसित किया गया है
1 टिप्पणियां
Hacker News की राय
मैंने लेखक से बात की है और खुद भाषा को चलाकर नहीं देखा, लेकिन Lisette दिलचस्प लगती है और Go की तुलना में स्पष्ट रूप से बेहतर भाषा जैसी दिखती है
फिर भी, मुझे लगता है कि Go की सीमाओं को पूरी तरह पार करना मुश्किल है। उदाहरण के लिए, Go के interface type से आने वाली
typed nilसमस्या को Lisette में Option से संभाला जाता है, लेकिन double unwrapping (Some(Some(h))) अटपटा लग सकता हैइसके अलावा Go का defer तरीका अब भी असुविधाजनक है, और RAII की तरह अपने-आप resource release नहीं करता
TypeScript ने JavaScript को इसलिए बेहतर बनाया क्योंकि browser में चलने वाला कोई विकल्प नहीं था, लेकिन अब WASM है, इसलिए स्थिति अलग है
इसलिए मन में सवाल आता है, “जब Rust है तो Go को Rust जैसा क्यों बनाया जाए?”। हालांकि Lisette शायद इन दोनों के बीच की जगह को निशाना बना रही है
आखिरकार, Lisette उन लोगों के लिए उपयुक्त भाषा लगती है जो मौजूदा Go codebase को बेहतर बनाना चाहते हैं या Go runtime का इस्तेमाल जारी रखना चाहते हैं
मुझे जिस बात की कमी महसूस हुई, वह है quick start guide — “Go की जगह अगली file को Lisette में लिखना शुरू कैसे करूँ?”
संबंधित ब्लॉग पोस्ट: Go is still not good
जिन problem domain में complex reference graph को संभालना होता है, वहाँ GC ज़रूरी है, और Go की user-mode stack संरचना की वजह से इसका memory model काफ़ी efficient है
Go ऐसे तेज़ CLI tool बनाने के लिए भी उपयुक्त है — उदाहरण: wordle-tui
syntax सरल है, cross-platform support है, runtime और GC built-in हैं, “errors as values” संरचना है, green thread हैं, तेज़ AOT compiler है — ऐसे कई फायदे हैं
Go का
deferउपयोगी है, लेकिन error handling और scope rules अटपटे हैंTypeScript भी इस समस्या को हल नहीं कर सकी, बल्कि और खराब है। इसलिए मैंने खुद Option type package बनाकर NPM पर डाला → fp-sdk
Go में compile होने वाली भाषाएँ पहले से कई हैं — XGo, Borgo, Soppo आदि
(T, error)return को सिर्फ़ Result type से बदल देते हैं, लेकिन semantic रूप से यह पूरी तरह समान नहीं हैउदाहरण के लिए
io.Reader.Readमें(n!=0, io.EOF)normal termination का मतलब होता है, इसलिए इसे सीधे error की तरह संभालना गलत behavior पैदा करेगाLisette के error message की quality प्रभावशाली है। “help” hint सच में उपयोगी लगते हैं
लेकिन Go में बदला गया code बहुत verbose हो सकता है, इसलिए runtime error आने पर Go code में debugging करनी पड़ेगी — यह चिंता की बात है
साथ ही, मौजूदा Go code से Lisette को call करना मुश्किल दिखता है
जिज्ञासा है कि Lisette एक experimental language है या सच में production को लक्ष्य बना रही है
lis run --debugoption इस्तेमाल करने पर Go code में//line source.lis:21:5comment डाला जाता है, जिससे stack trace मूल Lisette code से map हो जाता हैLSP compile-time error को
.lisfile के आधार पर संभालता हैअभी Go से Lisette को call करने की सुविधा नहीं है, लेकिन Lisette से Go package import करने की सुविधा प्राथमिकता में है
शुरुआत में यह एक experiment था, लेकिन इसे production-grade language बनाना लक्ष्य है
समझ नहीं आता कि Rust जैसी syntax को वैसे का वैसा क्यों नहीं लिया गया
उदाहरण:
import "foo.bar"की जगहuse foo::bar,Bar.Baz =>की जगहBar::Baz =>आदिजो लोग Rust जानते हैं वे भ्रमित होंगे, और जो नहीं जानते वे Rust की जानकारी यहाँ से transfer नहीं कर पाएँगे
intऔरfloat64जैसे नाम Go की type naming convention का पालन करते हैं+की जगह.लिखना होता है, यह मैं अक्सर भूल जाता हूँGo runtime अच्छा है, लेकिन भाषा खुद भारी-भरकम और सुधार की इच्छा से रहित लगती है
इसलिए अगर कोई transpiler तक इस्तेमाल कर रहा है, तो शायद उसे सच में Go से नफ़रत होगी
समझ नहीं आता कि Rust और Rust-जैसी भाषाएँ struct और method को अलग क्यों रखती हैं
struct के अंदर method सीधे define क्यों नहीं किए जा सकते, यह सवाल है
साथ ही impl block पर struct से अलग generic constraints लगाए जा सकते हैं, इसलिए कई impl define किए जा सकते हैं
और अंत में, Rust ऐसी भाषा है जिसे डेटा की shape को केंद्र में रखकर सोचने के लिए डिज़ाइन किया गया है
अगर Python जैसा दिखने वाली कोई भाषा हो जो Rust या Go में compile हो जाए, तो वह सच में शानदार होगी
Lisette, Go की सादगी और Rust की जटिलता के बीच अच्छा संतुलन बनाने वाली भाषा लगती है
क्या वजह है कि इसकी compile speed Go से बहुत धीमी हो, और Rust की कौन-सी सुविधाएँ जानबूझकर छोड़ी गई हैं — यह जानना दिलचस्प होगा
उदाहरण: borrow checking, data type, async आदि
Go सीखना आसान है, लेकिन features कम हैं
Lisette वह भाषा लगती है जो इस खाली जगह को भरती है, इसलिए दिलचस्प है
जैसे TypeScript ने JavaScript को बढ़ाया, वैसे ही अगर Go में expressive type system और strict compiler जोड़ दिए जाएँ, तो वह एक शानदार backend language बन सकती है
मेरी व्यक्तिगत सलाह होगी कि TypeScript frontend के साथ type sharing का support दिया जाए। backend में TypeScript के लोकप्रिय होने की यह भी एक बड़ी वजह है
एक infrastructure automation developer के रूप में, जो Rust की safety और Go की simplicity के बीच सोचता रहता है, Go runtime पर Rust की usability चढ़ाने का विचार बहुत आकर्षक लगता है
मैं इस project की प्रगति पर नज़र बनाए रखूँगा