1 poin oleh GN⁺ 11 jam lalu | 1 komentar | Bagikan ke WhatsApp
  • 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

 
GN⁺ 11 jam lalu
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

    • Joe kelihatan cukup bagus. Saya memang belum pernah memakai Janet secara langsung, tapi saya selalu menganggapnya sebagai bahasa yang menempuh arahnya sendiri alih-alih mencoba mengikuti Clojure
  • 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

    • Saya suka demo 9social. Saya sendiri bukan pengguna Plan 9, tetapi saya selalu terinspirasi oleh cara ala Plan 9
    • Saya mulai mendistribusikan binary amd64 dan arm 32-bit untuk Plan 9 di rilis GitHub
      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

    • Gloat/Glojure tampaknya punya cerita terbaik dari sisi runtime yang di-host berkat pipeline AOT source Go. Saat kompilasi, Anda bisa mengimpor apa pun dari Go
      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

    • Sudah saya perbaiki. Di mesin saya hasilnya 6~7ms, dan median-nya tampaknya sekitar 6.5ms
  • 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 pernah memikirkan ide membuat DSL gaya PHP lama yang secara internal memanfaatkan runtime dan package Go
      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
    • Kalau nanti benar-benar sempat memakainya, saya akan senang jika Anda meninggalkan satu atau dua issue
  • Sebagai alternatif, ada juga Joker: https://joker-lang.org
    Menurut saya ini benar-benar luar biasa, tetapi sangat diremehkan

    • Bagian yang paling saya hargai dari Joker adalah wrapper pustaka Go-nya sangat mulus. Tampaknya hampir semua yang disediakan Go sudah ditangani
      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”?

    • Memberi nama memang sulit, tetapi saya suka let-go. Ini permainan kata berlapis
      (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