- let-go adalah dialek Clojure yang ditulis dalam Go, dilengkapi compiler bytecode dan stack VM, serta berjalan tanpa JVM sebagai biner tunggal sekitar 10MB
- Cold start sekitar 7 ms, dan kompatibilitas Clojure menurut jank-lang Clojure test suite diklaim lulus 4696 / 4921 assertion (95,4%)
- Pembuatnya menggunakannya untuk CLI, skrip, dan web server, juga telah membuat daemonless container runtime di atas let-go, dan dapat mengompilasinya menjadi biner mandiri atau halaman web WASM yang self-contained
- Tujuannya adalah mengimplementasikan banyak fitur Clojure seperti persistent data structures, lazy seqs, transducers, protocols, records, multimethods, core.async, BigInts, serta menyediakan interop dua arah untuk fungsi,
struct, dan channel Go
- Ini bukan drop-in replacement untuk Clojure JVM, tidak memuat JAR, dan proyek nyata yang memiliki dependensi pustaka memerlukan penyesuaian
- Pada benchmark Apple M1 Pro, ditunjukkan ukuran biner 10MB, waktu mulai 6,7 ms, dan memori idle 13,5MB, sehingga unggul dalam jejak eksekusi yang lebih kecil dibanding Babashka, Joker, go-joker, gloat, dan Clojure JVM
- Untuk pekerjaan komputasi numerik yang lebih besar, WASM JIT milik go-joker atau JVM yang sudah dipanaskan dengan HotSpot lebih unggul; let-go dirangkum memiliki performa mirip Babashka di sebagian besar benchmark algoritme dan lebih dari 10 kali lebih cepat daripada Joker upstream
- Namespace standar mencakup
clojure.core, clojure.string, clojure.set, clojure.edn, clojure.test, clojure.core.async, io, http, json, transit, os, System, syscall, pods, dan lainnya
- Dapat memuat Babashka pods, sehingga ekosistem pod untuk SQLite, AWS, Docker, pemantauan file, dan lainnya bisa digunakan, serta berbagi
~/.babashka/pods/ dengan bb
- Batasan yang diketahui mencakup belum diimplementasikannya Refs / STM, Agents, hierarchies, reader tagged literals,
deftype, reify, clojure.spec, alter-var-root, subseq / rsubseq, serta belum adanya deteksi otomatis overflow int64
- Sebagai perbedaan perilaku, blok
go adalah goroutine sungguhan alih-alih state machine IOC, regex menggunakan re2 milik Go alih-alih Java regex, dan sistem angkanya terdiri dari int64 + float64 + BigInt
- Instalasi tersedia melalui Homebrew untuk macOS/Linux, Releases untuk amd64/arm64 di Linux, macOS, dan Windows, atau dengan Go 1.22+ lewat
go install github.com/nooga/let-go@latest
lg mendukung REPL, evaluasi expression, dan menjalankan file, serta menyediakan kompilasi bytecode .lgb, bundling executable mandiri, hingga pembuatan aplikasi web WASM
- Output WASM terdiri dari
index.html self-contained sekitar 6MB gzipped yang menyertakan WASM inlined dan service worker; saat menggunakan namespace term, tersedia emulasi terminal berbasis xterm.js
- Server nREPL bawaan bekerja dengan CIDER, Calva, dan Conjure, dan di dalam program Go, let-go dapat di-embed sebagai lapisan scripting melalui
pkg/api untuk meneruskan nilai, fungsi, struct, dan channel Go ke VM
1 komentar
Komentar Hacker News
Bagus! Belakangan ini saya juga mencoba bereksperimen menambahkan sintaks Lisp di atas semantik Go: https://codeberg.org/veqq/Joe
Untuk bahasa keluarga Clojure tanpa JVM, Janet juga sangat bagus, dan sudah saya pakai di production selama beberapa waktu: https://janet-lang.org/
Kalau ingin VM dan pustaka Lua, ada juga Fennel
REPL browser Wasm ini juga layak dicoba: https://gloathub.org/repl/
Gloat adalah alat otomatisasi Glojure AOT
Musim panas lalu saya membuat Glojure AOT menjadi mungkin bersama James Hamlin, dan sejak itu terus mengembangkannya. Saya juga sedang bekerja dengan marcingas(nooga) agar Gloat/Glojure/let-go bisa saling bekerja sama dengan baik
Menakjubkan bahwa ini berjalan di Plan 9
Akan keren kalau Go menjadi bahasa kelas satu di 9front, yaitu bahasa yang disertakan secara bawaan
Saya sedang mengutak-atik jejaring sosial untuk Plan 9: https://youtube.com/watch?v=q6qVnlCjcAI&si=MBCeM0QdA0WsKAe7
Semuanya dibuat dengan rc dan awk, tapi ada beberapa bagian yang rasanya akan lebih enak jika ada Go atau Clojure di tengah-tengahnya
amd64 sudah diuji di 9front dan tampaknya semuanya berjalan baik. CLI-nya memang belum terlalu terasa seperti Plan 9, tetapi suatu saat saya ingin membuat port-nya lebih native
Sekarang sudah ada beberapa dialek Go dari Clojure, jadi yang paling ingin saya tahu adalah mana yang sepenuhnya di-host di atas Go dan menawarkan tingkat interoperabilitas dengan Go seperti yang dimiliki Clojure JVM dengan Java
Akan bagus kalau saya bisa memakai apa yang saya buat dari Go, dan juga memakai Go dari Clojure, bahkan membuat proyek campuran. Selain interoperabilitas, akan bagus juga kalau ada penjelasan rinci tentang apa yang tetap sama dan apa yang berbeda
Sebaliknya, let-go bisa melakukan round-trip untuk nilai Go apa pun, termasuk struct, function, dan channel, tetapi tidak bisa langsung menarik pustaka Go sembarang tanpa wrapper. Pustaka seperti itu harus sudah dibangun saat runtime
Ini hanya catatan kecil, tetapi di README tertulis cold start 7ms, lalu beberapa baris di bawah tertulis 6ms. Mungkin makin cepat semakin jauh README-nya dibaca
Ini adalah jenis port Clojure yang selalu saya cari
Saya selalu merasa pustaka inti dan abstraksi channel milik Go adalah API dasar yang lebih sederhana dan lebih baik, dan tampaknya juga cocok dengan API keluarga core.async. Ini juga memenuhi keinginan akan binary tunggal yang besar
Terima kasih atas kerja kerasnya, dan begitu ketertarikan baru saya pada C++26 sedikit mereda, saya pasti akan melihat ini lagi
Selain itu, saya juga tidak tahu kenapa Glojure tidak pernah masuk radar saya; ini juga terlihat seperti proyek yang luar biasa
Saya menyebutnya PHP lama karena PHP awalnya lebih mirip DSL yang berpusat pada web, meski sekarang tidak lagi. Bahasa backend yang mudah dipakai, mirip PHP, tetapi ditenagai Go di belakangnya terdengar menarik, dan Clojure adalah pilihan yang sangat bagus
Sebagai alternatif, ada juga Joker: https://joker-lang.org
Menurut saya ini benar-benar luar biasa, tetapi sangat diremehkan
Meski begitu, saya tidak ingin menambahkan terlalu banyak hal ke let-go. Saya suka fakta bahwa ukurannya masih muat di bawah 10MB
Akan lebih baik jika nama bahasanya lebih bagus daripada sekadar “lets-go”. Bagaimana kalau “clogo”?
(let [...] (go ...))Memungkinkan Anda melakukan let di Go!
Bagi saya, Clogo adalah no-go. Kalau ada ide lain yang bagus, saya terbuka untuk mempertimbangkannya
Kami akan sangat senang jika Anda mengirim PR ke https://github.com/chr15m/awesome-clojure-likes