1 puan yazan GN⁺ 11 시간 전 | 1 yorum | WhatsApp'ta paylaş
  • 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ı, struct ve channel ile ç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, pods ve 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/ dizini bb ile 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 / rsubseq eksikliği ve int64 overflow’un otomatik algılanmaması bulunuyor
  • Davranış farkları olarak go blokları IOC state machine değil gerçek goroutine’ler; regex tarafında Java regex yerine Go re2 kullanılıyor ve sayı sistemi int64 + float64 + BigInt yapı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 .lgb bayt 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.html ve service worker’dan oluşuyor; term namespace 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/api aracılığıyla let-go bir betik katmanı gibi gömülebiliyor ve Go değerleri, fonksiyonları, struct ve channel nesneleri 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

    • Joe fena görünmüyor. Janet’i bizzat kullanmadım ama Clojure’u takip etmeye çalışmaktan ziyade kendi yönüne giden bir dil olduğunu düşünmüştüm
  • Ş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

    • 9social demosunu beğendim. Bizzat bir Plan 9 kullanıcısı değilim ama Plan 9 tarzı yaklaşım bana her zaman ilham veriyor
    • GitHub release’lerinde Plan 9 için amd64 ve arm 32 bit binary dağıtmaya başladım
      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

    • Gloat/Glojure, Go kaynak AOT pipeline sayesinde host edilen runtime tarafında en güçlü hikâyeye sahip gibi görünüyor. Derleme zamanında Go’daki her şeyi içeri alabiliyorsunuz
      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

    • Düzelttim. Benim makinemde 6~7ms arası ve medyan yaklaşık 6.5ms gibi görünü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

    • İçeride Go runtime’ını ve paketlerini kullanan, eski PHP tarzı bir DSL yapma fikrini düşünmüştüm
      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
    • İleride gerçekten denerseniz bir iki issue bırakmanız harika olur
  • Alternatif olarak Joker da var: https://joker-lang.org
    Gerçekten müthiş ve bence tamamen hak ettiği değeri görmüyor

    • Joker’da takdir ettiğim şey, Go kütüphanelerini sarmalamanın son derece pürüzsüz olması. Go’nun sunduğu her şeyi kapsıyor gibi görünü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?

    • İsim bulmak zor ama let-go hoşuma gidiyor. Katmanlı bir kelime oyunu var
      (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