let-go - Go ile yazılmış, 7 ms başlangıç süresine sahip Clojure türevi dil
(github.com/nooga)- let-go, Go ile yazılmış bir Clojure lehçesi; bayt kodu derleyicisi ve stack VM’e sahip, JVM olmadan yaklaşık 10 MB’lık tek bir binary olarak çalışıyor
- Cold start süresi yaklaşık 7 ms ve jank-lang Clojure test suite ölçütüne göre Clojure uyumluluğu 4696 / 4921 assertion geçti (%95,4) olarak sunuluyor
- Geliştiricisi bunu CLI, betikler ve web sunucuları için kullanıyor; ayrıca let-go üzerinde daemonless container runtime da geliştirmiş ve bağımsız çalıştırılabilir binary’lere ya da kendi içinde paketlenmiş WASM web sayfalarına derlenebildiğini belirtiyor
- Hedefler arasında persistent data structures, lazy seqs, transducers, protocols, records, multimethods, core.async, BigInts gibi Clojure’un birçok özelliğini hayata geçirmek ve Go fonksiyonları,
structvechannelile çift yönlü interop sağlamak bulunuyor - JVM Clojure için bir drop-in replacement değil; JAR yüklemiyor ve kütüphane bağımlılıkları olan gerçek projelerde uyarlama gerekebiliyor
- Apple M1 Pro kıyaslamasında binary boyutu 10 MB, başlangıç süresi 6,7 ms, boşta bellek kullanımı 13,5 MB olarak veriliyor; Babashka, Joker, go-joker, gloat ve Clojure JVM’e göre daha küçük çalışma birimi tarafında avantaj sunduğu belirtiliyor
- Daha büyük sayısal hesaplama işlerinde go-joker’ın WASM JIT’i veya yeterince ısınmış HotSpot JVM öne çıkarken, let-go’nun çoğu algoritma kıyaslamasında Babashka’ya benzer ve upstream Joker’dan 10 kattan fazla daha hızlı sonuç verdiği özetleniyor
- Standart namespace’ler arasında
clojure.core,clojure.string,clojure.set,clojure.edn,clojure.test,clojure.core.async,io,http,json,transit,os,System,syscall,podsve diğerleri yer alıyor - Babashka pods yüklenebildiği için SQLite, AWS, Docker, dosya izleme gibi pod ekosistemi kullanılabiliyor ve
~/.babashka/pods/dizinibbile ortak kullanılıyor - Bilinen kısıtlar arasında Refs / STM, Agents, hierarchies, reader tagged literals,
deftype,reify,clojure.spec,alter-var-root,subseq/rsubseqeksikliği ve int64 overflow’un otomatik algılanmaması bulunuyor - Davranış farkları olarak
goblokları IOC state machine değil gerçek goroutine’ler; regex tarafında Java regex yerine Gore2kullanılıyor ve sayı sistemiint64+float64+BigIntyapısından oluşuyor - Kurulum; macOS/Linux için Homebrew, Linux·macOS·Windows üzerinde amd64/arm64 için Releases veya Go 1.22+ ile
go install github.com/nooga/let-go@latestüzerinden yapılabiliyor lg; REPL, expression eval ve dosya çalıştırmayı destekliyor; ayrıca.lgbbayt kodu derleme, bağımsız executable paketleme ve WASM web uygulaması üretimi de sunuyor- WASM çıktısı, inlined WASM içeren yaklaşık 6 MB gzipped kendi içinde paketli bir
index.htmlve service worker’dan oluşuyor;termnamespace kullanıldığında xterm.js tabanlı terminal emülasyonu sağlanıyor - Yerleşik nREPL sunucusu CIDER, Calva ve Conjure ile çalışıyor; Go programlarının içinde ise
pkg/apiaracılığıyla let-go bir betik katmanı gibi gömülebiliyor ve Go değerleri, fonksiyonları,structvechannelnesneleri VM’e aktarılabiliyor
1 yorum
Hacker News görüşleri
Güzel görünüyor! Kısa süre önce Go semantiğini Lisp sözdizimiyle birleştirmeyi deneyen bir deneme yaptım: https://codeberg.org/veqq/Joe
JVM’siz Clojure benzeri diller arasında Janet de gerçekten çok iyi; bir süredir prodüksiyonda kullanıyorum: https://janet-lang.org/
Lua VM ve kütüphanelerini istiyorsanız Fennel de var
Şu Wasm tarayıcı REPL’ini de denemekte fayda var: https://gloathub.org/repl/
Gloat, Glojure için bir AOT otomasyon aracı
Geçen yaz James Hamlin’le birlikte Glojure AOT’yi mümkün hale getirdik ve o zamandan beri geliştirmeyi sürdürüyoruz. Ayrıca marcingas(nooga) ile de Gloat/Glojure/let-go’nun birbiriyle iyi çalışması için uğraşıyoruz
Plan 9 üzerinde çalışması şaşırtıcı
Go’nun 9front’ta birinci sınıf, yani varsayılan olarak gelen bir dil olması harika olurdu
Plan 9 için bir sosyal ağ üzerinde uğraşıyorum: https://youtube.com/watch?v=q6qVnlCjcAI&si=MBCeM0QdA0WsKAe7
Her şey rc ve awk ile yapılmış durumda ama aralarda Go ya da Clojure olsa iyi olurdu dediğim yerler var
amd64’ü 9front üzerinde test ettim ve her şey düzgün çalışıyor gibi görünüyor. CLI çok da Plan 9 usulü değil ama bir gün portu daha yerel hale getirmeye niyetim var
Artık Clojure’un birkaç Go lehçesi var; bu yüzden en çok merak ettiğim şey, hangisinin Go üzerinde tamamen host edildiği ve JVM Clojure’un Java ile sahip olduğu düzeyde birlikte çalışabilirlik sunduğu
Go’da yazdıklarımı kullanabilmek, Clojure’dan da Go’yu kullanabilmek ve hatta karma projeler oluşturabilmek isterdim. Ayrıca yalnızca birlikte çalışabilirlik değil, nelerin aynı olmadığı ve nasıl farklılaştıkları da ayrıntılı biçimde belgelenmiş olsa güzel olurdu
Buna karşılık let-go, struct, function ve channel dahil her türlü Go değerini iki yönlü taşıyabiliyor ama rastgele bir Go kütüphanesini sarmalayıcı olmadan doğrudan içeri alamıyor. Böyle kütüphanelerin runtime’da derlenmiş olması gerekiyor
Küçük bir not ama README’de cold start 7ms denmiş, birkaç satır aşağıda ise 6ms yazıyor. Sanırım README’yi okudukça hızlanıyor
Tam da hep aradığım türden bir Clojure portu
Çünkü Go’nun çekirdek kütüphanesiyle channel soyutlamasının daha basit ve daha iyi bir temel API sunduğunu düşünüyordum; ayrıca core.async tarzı API’lerle de iyi uyum sağlar gibi duruyor. Büyük tekil binary isteğini de karşılıyor
Emeğiniz için teşekkürler; C++26’ya yönelik yeni ilgim biraz yatışınca buna kesin tekrar bakacağım
Ek olarak Glojure’un neden şimdiye kadar radarımda olmadığını bilmiyorum; o da dışarıdan bakınca harika bir proje gibi görünüyor
Eski PHP dememin sebebi, PHP’nin başlangıçta web merkezli bir DSL’e daha yakın olmasıydı; artık öyle değil. Arkasında Go’nun gücü olan, PHP benzeri, yazması kolay bir backend dili ilginç olurdu ve Clojure bunun için harika bir seçim
Alternatif olarak Joker da var: https://joker-lang.org
Gerçekten müthiş ve bence tamamen hak ettiği değeri görmüyor
Yine de let-go’ya fazla şey eklemek istemiyorum. 10MB içinde kalmasını seviyorum
Dilin adı keşke sadece “lets-go”dan daha iyi bir şey olsaymış. “clogo” nasıl?
(let [...] (go ...))Go’da let yapmanı sağlıyor!
Clogo bana göre no-go. Başka fikirler varsa iyi olanları değerlendirmeye açığım
https://github.com/chr15m/awesome-clojure-likes için bir PR gönderirseniz çok memnun olurum