announcements 2026-07-11

https://github.com/kulminaator/clojurez A subset of clojure built in zig. Minified binary is ~1MB , should support most essentials, but it's zig only, absolutely zero jvm support. The aim was to built something really small and concentrated, giving all the basics like i/o, multiple threads, math with clojure number types, data manipulation. Small apps run within some tens of milliseconds. • Consider this a heavy alpha version, definitely do not pick this up for any production system just yet. • From the quirks section - there isn't really a limit as far as i know of on the stack depth, i just ran a 15 000 steps deep recursion test "for fun" and it worked just fine. • If you find something that is broken, be kind to let me know.

$ time zig-out/bin/clojurez-mini -e '(time (reduce + (map inc (range 9999))))'
Elapsed time: 19.373176 msecs
49995000

real	0m0.069s
user	0m0.044s
sys	0m0.024s

❤️ 17

What's your .cljc reader branch?

I have not yet leaped towards any portability goals. Just started this a month ago out of interest "can i make this even work". And i tried to pull as little zig awareness into the runtime as possible, to keep it clean. I wanted to build a small clojure, not "clojure for zig".

👍 2

The main reason why it is written in zig is that zig builds nicely towards linux, macos and windows. And i get static binaries as result, meaning zero deps on anything once compiled (might come in handy in docker containers etc. where you don't have the planet to dynamically link against).

👍 1

Interpreter. Will it interop with Zig down the line?

zig gets compiled to machine code, and only the parts really needed for the application are included in the binary ... i am somewhat confused on what your expectations there would be

i did consider supporting something along the lines of dlopen ... so if you really want to use a dynamic library from somewhere - it would be on the table

(the parts of the zig std library that is necessary for my clojure vm gets baked into the static binary, but i am pretty sure about 95% of what std zig library is offering isn't needed, so it's never compiled or linked into my static binaries)

obviously for the parts that currently are needed some kind of interop already exists , functions in the zig.core namespace bind directly to according functions in zig source code

Hi @kulminaator, congrats on the project! This looks like a stack vm, quite familiar with these 🙂 Couple of ideas you might want to consider: • Add TCO beyond loop/recur - it accelerates the VM and unlocks infinite recursion. It looks like you already track tail positions for recur so it shouldn't be that hard. • Try passing https://github.com/jank-lang/clojure-test-suite to see how much of a Clojure is it - great way to clean up the edge cases, • Benchmark against other almost-Clojures like #let-go and #mino for fun • I think @didibus meant a fleshed out FFI paradigm where all values crossing the boundary, including functions, are representable and can be trivially used as native on either side. Once that's well defined exposing dlopen is a good idea and can be done easily - loading dynamic libs unlocks all the fun. Consider JITing the trampolines here.

https://github.com/SevereOverfl0w/campfire.nvim - A neovim plugin for connecting to your nREPL - first public release. The UX is very similar to that of vim-fireplace. However, I wanted something more deeply integrated with the nREPL ecosystem: 1. Lean into the built-in testing framework more - you now get navigable exceptions in your quickfix, and they work more reliably when the namespace won't load 2. Better integration with ClojureScript REPLs - No more :CljEval or :Piggieback. Convenient templates for common ClojureScript environments, testing works a treat, multi-forms work properly in all environments, 3. Support for more Clojure-likes: Babashka (no more error message 🙃), sci, nbb, and let-go have all been tested and have integration tests covering them (not included in repo for your plugin size). Use :Scope to switch between babashka, cljs, clj etc. quickly in any clj file (especially cljc!) 4. Unexpectedly, it's very fast. I'm putting this down to vim.uv / lua in general, but it is notably very snappy. 5. lsp integration. Install the none-ls.nvim dependency, then your lsp bindings will just work. This is the preferred way to jump to source, view docs, do completion, etc. Works alongside clojure-lsp. Minor additional features: configurable pretty printing, virtual text eval output, better "broken" namespace recovery (I'm not sure what it says that this was a priority for me) Fireplace features: :Last, cpp, macroexpansion, c!, etc. Missing: CljEval/Piggieback, quasi-repl #vim is probably the best place if you'd like to discuss further. Given how bozhidar is hot on Sayid at the moment, I'll likely be looking into that once 0.13 releases with vim.ui.tree, watch this space. Note: This plugin is vibe coded: I haven't looked at any of the code. This is not my preference, but campfire works annoyingly well and has become my driver in spite of that. I felt I should share the plugin in light of that.

🚀 8