- let-go Go में लिखा गया एक Clojure dialect है, जिसमें bytecode compiler और stack VM है, और यह JVM के बिना लगभग 10MB binary के रूप में चलता है
- cold start लगभग 7ms है, और jank-lang Clojure test suite के अनुसार Clojure compatibility 4696 / 4921 assertions pass (95.4%) बताई गई है
- लेखक इसका उपयोग CLI, scripts और web server के लिए कर रहे हैं, और let-go के ऊपर daemonless container runtime भी बनाया है; इसे standalone executable binary या self-contained WASM web page के रूप में compile किया जा सकता है
- लक्ष्य है Clojure की कई सुविधाओं जैसे persistent data structures, lazy seqs, transducers, protocols, records, multimethods, core.async, BigInts आदि को implement करना, साथ ही Go functions·structs·channels के साथ दो-तरफ़ा interop देना
- यह JVM Clojure का drop-in replacement नहीं है, JAR load नहीं करता, और library dependency वाले वास्तविक projects में adjustments की ज़रूरत होगी
- Apple M1 Pro benchmark में binary size 10MB, startup time 6.7ms, idle memory 13.5MB के साथ Babashka, Joker, go-joker, gloat और Clojure JVM की तुलना में छोटे execution footprint में बढ़त दिखाई गई है
- बड़े numerical computing workloads में go-joker का WASM JIT या warmed-up JVM का HotSpot आगे रहता है, जबकि let-go ज़्यादातर algorithm benchmarks में Babashka के समान है और upstream Joker से 10x से अधिक तेज़ बताया गया है
- standard namespaces में
clojure.core, clojure.string, clojure.set, clojure.edn, clojure.test, clojure.core.async, io, http, json, transit, os, System, syscall, pods आदि शामिल हैं
- यह Babashka pods load कर सकता है, इसलिए SQLite, AWS, Docker, file watching जैसे pod ecosystem का उपयोग संभव है, और
~/.babashka/pods/ को bb के साथ साझा करता है
- ज्ञात सीमाओं में Refs / STM, Agents, hierarchies, reader tagged literals,
deftype, reify, clojure.spec, alter-var-root, subseq / rsubseq का unimplemented होना और int64 overflow का automatic detection न होना शामिल है
- व्यवहार के अंतर में
go block का IOC state machine की जगह वास्तविक goroutine होना, regex के लिए Java regex की जगह Go re2 का उपयोग, और number system का int64 + float64 + BigInt पर आधारित होना शामिल है
- installation macOS/Linux के लिए Homebrew, Linux·macOS·Windows के amd64/arm64 builds के लिए Releases, या Go 1.22+ में
go install github.com/nooga/let-go@latest से की जा सकती है
lg REPL, expression eval और file execution को support करता है, साथ ही .lgb bytecode compile करना, standalone executable bundling, और WASM web app generation भी देता है
- WASM output लगभग 6MB gzipped self-contained
index.html और service worker से बनता है, जिसमें inlined WASM शामिल होता है; term namespace इस्तेमाल करने पर xterm.js-आधारित terminal emulation भी मिलता है
- built-in nREPL server CIDER, Calva, Conjure के साथ काम करता है, और Go programs के अंदर
pkg/api के जरिए let-go को scripting layer की तरह embed किया जा सकता है ताकि Go values·functions·structs·channels को VM में पास किया जा सके
1 टिप्पणियां
Hacker News की राय
बढ़िया है! हाल ही में मैंने Go semantics पर Lisp syntax चढ़ाने का एक प्रयोग किया था: https://codeberg.org/veqq/Joe
JVM के बिना Clojure-family में Janet भी सच में बहुत अच्छा है, और मैं इसे कुछ समय से production में इस्तेमाल कर रहा हूँ: https://janet-lang.org/
अगर Lua VM और libraries चाहिएँ, तो Fennel भी है
यह Wasm browser REPL भी आज़माने लायक है: https://gloathub.org/repl/
Gloat, Glojure के लिए AOT automation tool है
पिछली गर्मियों में मैंने James Hamlin के साथ मिलकर Glojure AOT को संभव बनाया था, और तब से इसे आगे बढ़ाता आ रहा हूँ। marcingas(nooga) के साथ भी इस पर काम कर रहा हूँ ताकि Gloat/Glojure/let-go एक-दूसरे के साथ अच्छी तरह काम करें
यह Plan 9 पर चलता है, यही बात चौंकाने वाली है
अगर Go, 9front में first-class language यानी default included language बन जाए, तो काफ़ी शानदार होगा
मैं Plan 9 के लिए एक social network पर काम कर रहा हूँ: https://youtube.com/watch?v=q6qVnlCjcAI&si=MBCeM0QdA0WsKAe7
सब कुछ rc और awk में है, लेकिन बीच-बीच में ऐसी जगहें थीं जहाँ Go या Clojure होना अच्छा रहता
amd64 को 9front पर टेस्ट किया है और लगता है सब ठीक चल रहा है। CLI अभी ज़्यादा Plan 9-जैसी नहीं है, लेकिन कभी न कभी इसे और native बनाने के लिए port करने का इरादा है
अब जबकि Clojure की कुछ Go dialects मौजूद हैं, मेरी सबसे बड़ी जिज्ञासा यह है कि इनमें से कौन-सी Go पर पूरी तरह hosted है, और JVM Clojure का Java के साथ जितने स्तर का interoperability है, वैसा देती है
अच्छा होगा अगर मैं Go में अपनी बनाई चीज़ें इस्तेमाल कर सकूँ, और Clojure में भी Go का उपयोग कर सकूँ, यहाँ तक कि mixed projects भी बना सकूँ। साथ ही interoperability के अलावा क्या समान है, क्या नहीं है, और कैसे अलग है—यह सब भी विस्तार से दर्ज हो तो अच्छा रहेगा
दूसरी तरफ let-go में structs, functions, channels समेत किसी भी Go value को आगे-पीछे भेजा जा सकता है, लेकिन किसी मनमानी Go library को बिना wrapper के सीधे नहीं खींचा जा सकता। ऐसी library को runtime में build किया हुआ होना चाहिए
छोटी-सी बात है, लेकिन README में ऊपर cold start 7ms लिखा है और कुछ लाइनों नीचे 6ms। शायद README पढ़ते-पढ़ते यह और तेज़ हो जाता है
यह वही तरह का Clojure port है जिसकी मैं हमेशा तलाश में था
मुझे लगता था कि Go की core libraries और channel abstraction एक ज़्यादा सरल और बेहतर foundational API देती हैं, और यह core.async-टाइप API के साथ भी अच्छी तरह फिट बैठेगा। साथ ही बड़े single binary की चाह भी पूरी होती है
काम के लिए धन्यवाद, और C++26 के लिए मेरा नया लगाव थोड़ा शांत हो जाए तो मैं इसे ज़रूर फिर से देखूँगा
वैसे यह भी समझ नहीं आ रहा कि Glojure मेरे radar पर अब तक क्यों नहीं था; देखने में यह भी शानदार project लगता है
old-school PHP कहने का मतलब यह है कि PHP मूल रूप से web-centric DSL के काफ़ी करीब था, अब वैसा नहीं है। पीछे Go की ताकत के साथ PHP-जैसी आसान backend language दिलचस्प हो सकती है, और Clojure उसके लिए बढ़िया चुनाव है
एक विकल्प Joker भी है: https://joker-lang.org
यह सच में शानदार है, लेकिन मेरी राय में बहुत कम आंका गया है
लेकिन मैं let-go में बहुत ज़्यादा चीज़ें जोड़ना नहीं चाहता। मुझे यह बात पसंद है कि यह 10MB के अंदर समा जाता है
भाषा का नाम सिर्फ “lets-go” से बेहतर होना चाहिए। “clogo” कैसा रहेगा?
(let [...] (go ...))यह आपको Go में let करने देता है!
Clogo मेरे लिए no-go है। अगर और ideas हों, तो अच्छे वाले देखने में ख़ुशी होगी
https://github.com/chr15m/awesome-clojure-likes पर एक PR भेजें तो उसका बहुत स्वागत होगा