https://github.com/borkdude/cljbang.el A light-weight Clojure-like language that runs directly in Emacs Lisp. The way this is made is inspired by squint. Read the README for more :) https://github.com/borkdude/cljbang.el
I've been wanting a book or guide along the lines of "writing elisp for the clojure-minded". This is not that, but it might be an even better idea π
(That said, for writing/maintaining elisp intended for an audience wider than the already clojure-infected, adding this as a dependency might not be preferred. This is not a criticism of clj!, just me thinking out loud about the use-cases I had in mind.)
Yeah I know. It's probably for end users only. There are Clojure to Elisp transpilers out there but I don't know how well their code is to just check that into source control
Very nifty, though, for the end user! π
That's very cool!
Would love to see/know about people that migrated they whole config to it and how it plays in performance those cases
Just ask your robot to do a POC?
maybe! but that will mean lose my emacs for some time during the tests hehe
you can totally write another config and launch a headless emacs on the side?
hum I think so
you should measure the second invocation of a .clj file though, the first time it's processed, but then byte-compiled to .elc
I just measured here. the cljbang "runtime" takes 2ms to load. a compiled ns with 1000 functions 1ms
but of course it's be better to measure a real project
sounds awesome!
Allow me some level-headed reasoning. Please don't get me wrong Michiel, this absolutely looks cool and I hope it grows into something far more practical than "just cool". From pure syntactic/cosmetic point, perhaps it's not hugely defensible. Idiomatic, modern Elisp can look nearly identical. Here's elisp and cljbang:
(defun visible-major-modes ()
(thread-last (window-list)
(seq-map (lambda (w) (buffer-local-value 'major-mode (window-buffer w))))
(seq-uniq)))
(defn visible-major-modes []
(->> (el/window-list)
(map (fn [w] (el/buffer-local-value 'major-mode (el/window-buffer w))))
distinct))
Even the example from the readme can be written semantically closer to cljbang:
(defun stale-buffers ()
(thread-last (buffer-list)
(seq-filter (lambda (b)
(when-let* ((f (buffer-file-name b)))
(not (file-exists-p f)))))
(mapcar #'buffer-name)))
More experienced Lisper with roots in CL may even write it like this:
(defun stale-buffers ()
(cl-loop for b in (buffer-list)
for f = (buffer-file-name b)
when (and f (not (file-exists-p f)))
collect (buffer-name b)))
Anything driven by interactive specs, save-excursion, with-current-buffer, iterating over buffer regions - you'd have to call things through el/ and probably gain little, sometimes it may even read worse because of the el/ prefix noise.
Macro-heavy configs with use-package and general.el would suffer good deal, since cljbang has no syntax-quote (yet).
The sweet spot I guess would be pure data tranformation - list/alist wrangling, predicates, formatting - which doesn't happen a lot in a typical Emacs config. And at this point I don't think we realistically can discuss beyond configs, using this in packages - how portable that elisp would be? And you'd also need to be careful about silent footguns mentioned.
Knowing your tenacity for starting seemingly weird experiments and driving them to become practical tools, I do feel excited. I'd trade my dog if that got me real Clojure maps in elisp (with destructuring, blackjack and hookers). It sounds like I may just see that day sooner than I thought.You are right @ag but I'm not good at remembering the elisp API and language. Just like bash. You know what I did for bash.
Like I write in the README: > β οΈ I'm not sure if any of this is a good idea, but it kinda works for me.
Well, bash had no chance over Clojure. Problem with Elisp is that it is "worse is better" case. It's bad but not as bad. Like Python. I wish Python was bad enough to drive people away from it, but for most people it's just not that obviously bad.
I agree but still :)
Not trying to sell it to people who love elisp
Oh, but I don't love Elisp. I love Clojure. I merely tolerate Elisp. π
I wonder how it compares to https://github.com/BuddhiLW/clojure-elisp , this project is also still active it seems
@a2svior I'm sure it's an awesome project but it needs an external transpiler process which imo isn't really ergonomic while you're writing elisp functions, unless if you have way to invoke the transpiler, but this comes with a lot of tooling while elisp already has a good REPL-modeL
with cljbang everything just runs in emacs and you don't have to bring anything else
Makes sense, didn't think about that. Curious to try it out. Btw the author of the other project is also here I think @pedrogbranquinho
Cool! Is cljbang like squint and https://github.com/borkdude/clj2el is more honest to clojure? I have my own clojure -> elisp compiler. I'm still finding some parity bugs and I'm still adding benchmarks and I'm not dogfooding so interop hasn't had polish. I do hope you'll check it out when I'm done.
no clj2el is not more honest to clojure, it was also squint like but didn't even have a stdlib/runtime
more honest to clojure would be adding HAMT etc which imo is defeating the point of a thing that runs in emacs to configure emacs
@ag syntax-quote now works
Whoa, I feel like I'd have to send my dog to you, lol. I love my dog, slow down a bit with this awesomeness.
Why does hamt defeat the point? Erm, the point you're getting at is probably just different from why I wanted clojure on emacs lisp. I did it because I went bankrupt with emacs lisp again but I've never gone bankrupt with clojure so...
Now, since you brought this up, @borkdude I wonder how difficult would be to implement HAMTs in pure elisp...
Oh I'm sure it's possible, elisp is flexible enough
> Why does hamt defeat the point? Erm, the point you're getting at is probably just different from why I wanted clojure on emacs lisp. My bar isn't the high currently. A full faithful clojure runtime would isn't what I aim for here, I let elisp do the heavy lifting whenever I can.
I also want interoperability with other parts of emacs to be high, without having to go back and forth.
Yea. That makes sense. Sorry, I first read that as that hamt wouldn't make sense in absolute terms. Mb. I went as far as implementing java classes so that I could run real clojure libraries like clojure.tools.deps.
lol
Yea, idk how interop will shake out. I have singletons for true/false and nil/empty list.
that sounds way more ambitious
It has consumed most of my ai subs for over 10 weeks now.
https://github.com/datalevin/datalevin 1.0.0 is here! After six years of development, weβve reached this major milestone. Datalevin is built to replace SQL databases at the center of application state with one fact-first database supporting relational queries, graph traversal, logical reasoning, document access, full-text search, and vector search. Version 1.0 provides: β’ Almost full API parity across Clojure, Java, JavaScript, and Python β’ Embedded, client/server, and scripting deployment modes β’ Document path indexing, WAL, transaction logs, replicas, and HA β’ Built-in full-text, vector, embedding, and MCP capabilities The release comes with a new documentation website and a complete book: π https://datalevin.org π https://www.amazon.com/dp/B0H8X1QF2Q/ Thank you to everyone who contributed, tested, reported issues, and trusted Datalevin in production. Letβs build applications and agents that remember! π
Been using datalevin the last few months in a project at $JOB, extremely cool, and very happy to see it hit the big 1.0(.0)! Can't emphasize enough how patient @huahaiy and the rest of the #C01RD3AF336 people have been with all my embarrassingly-newbie questions gratitude
I haven't had the chance to use Datalevin in production yet, but I've been following this project with interest.
Hi all. Just posted on the Clojurists Together website - updates from Bozhidar Batsov, Clojure Camp, Eric Dallo, Michiel Borkent, Jeaye Wilkerson, Ambrose Bonnaire-Sergeant, Dragan Djuric, and Shantanu Kumar. Great work here - thanks to all! https://www.clojuriststogether.org/news/annually-funded-developers-update-may-june-2026/ https://www.clojuriststogether.org/news/july-2026-short-term-project-updates/
#C03DPCLCV9N joyride letβs you modify VS Code in user space, creating a hackable development environment, much like Emacs, though with a much nicer programming language: Clojure β€οΈ.
New version just out: https://github.com/BetterThanTomorrow/joyride/releases/tag/v0.0.79
β’ Add https://github.com/babashka/fsas a built-in library (includes`with-temp-dir`)
β’ Levarage recent SCI updates to make Joyride more CLJS complete, adding:
β¦ goog.math.Long
β¦ Math(`js/Math`)
β¦ clojure.core:`write-all`,`MapEntry`,`Keyword`,`Symbol`,`PersistentVector`,`Cons`,`EmptyList`,`List`,`PersistentArrayMap`,`PersistentHashMap`,`PersistentTreeMap`,`Subvec`,`PersistentHashSet`, and`PersistentTreeSet`
β’ Make`joyride.core/slurp`handle http(s) urls
The previous version added JIT-compilation of interpreted function bodies to JavaScript at runtime, speeding up loops and numerical code. (π€―).
Thanks, @borkdude for providing #C015LCR9MHD and making it ever more awesome all the time! β€οΈ
https://clojure.org/news/2026/07/21/clojure-1-13-alpha5 is now available
Java 17 baseline
As of this release, Clojure requires a minimum Java 17 runtime and compiles to Java 17 bytecode.
β’ https://clojure.atlassian.net/browse/CLJ-2872 Move to new ASM and emit Java 17 bytecode
β’ https://clojure.atlassian.net/browse/CLJ-2383 Add new java.lang classes to automatic imports
β’ https://clojure.atlassian.net/browse/CLJ-2892 Remove uses of Javaβs security manager, which is going away
β’ https://clojure.atlassian.net/browse/CLJ-2920 Javadoc support updated for Java 17+
Other changes since last alpha
β’ https://clojure.atlassian.net/browse/CLJ-2968 Qualified :keys bindings in destructuring can only be unqualified symbols (regression fix)
β’ https://clojure.atlassian.net/browse/CLJ-2969 Add :select base cases to tests
β’ https://clojure.atlassian.net/browse/CLJ-2897 prepl is missing DynamicClassLoader and *repl* binding from repl
If you have issues or questions, please raise them as separate threads in #C03S1KBA2 or #C06E3HYPR so we can respond individually, thanks!
Thank you for fixing CLJ-2897 although, at this point, I no longer need it π but I may do again in the future perhaps.
https://github.com/datalevin/biff-datalevin is a Clojure library that adapts https://biffweb.com/ Web framework to use https://github.com/juji-io/datalevin as the database. This is what powers https://datalevin.org
https://github.com/tonsky/clj-simple-stats, a website analytics library for Clojure/Ring, hits 1.4.0 This release brings a much needed performance increase due to rolling statistics aggregation. Recommended to all users