announcements

Matti Uusitalo 2025-11-17T08:04:58.085469Z

malli 0.20.0 released https://clojars.org/metosin/malli/versions/0.20.0 See https://github.com/metosin/malli/releases/tag/0.20.0 for changelog

15
2
4
🎉 10
borkdude 2025-11-17T15:05:57.660169Z

New lib! Parmezan fixes unbalanced or unexpected parens or other delimiters in Clojure files. It's a light-weight script/lib that only relies on edamame for Clojure parsing and it's #babashka-compatible. Repo at: https://github.com/borkdude/parmezan Feel free to post issues.

🎆 5
5
18
🌟 6
borkdude 2025-11-18T13:03:47.906379Z

@cfleming To answer your question more. It doesn't do the parinfer behavior, indenting has no meaning for parmezan (so far). It removes trailing parens. It inserts closing parens where they need to be. That's pretty much it

borkdude 2025-11-18T13:13:19.268869Z

Ambiguity arises when you have an opening paren without a closing paren. You could either delete the opening paren or add a closing paren. Momentarily parmezan does the latter

borkdude 2025-11-18T13:13:38.255139Z

but at least you can then use paredit to continue fixing the file the way you want it

borkdude 2025-11-18T13:38:52.838439Z

Emacs integration for parmezan: https://github.com/borkdude/parmezan?tab=readme-ov-file#emacs-integration

p-himik 2025-11-17T15:06:35.569409Z

Neat! How did the name come to be?

thomas 2025-11-17T15:08:35.961229Z

it is cheesy 🧀

☝️ 1
borkdude 2025-11-17T15:11:13.763259Z

like most of my libs, the name is complete nonsense! :)

robert-stuttaford 2025-11-17T15:41:29.907329Z

nice for LLM outputs!

Zeniten 2025-11-17T15:46:36.123529Z

😂 1
borkdude 2025-11-17T15:51:09.031759Z

Note: this isn't as good as parinfer probably, but a lot simpler ;)

pez 2025-11-17T15:52:10.750919Z

This goes straight into both Calva and Calva Backseat Driver (I checked, #edamame works in ClojureScript). Thanks for providing!

cfleming 2025-11-18T00:01:16.690009Z

Is there any description anywhere of how this works? Does it just add a closing paren when it notices that one is missing? How does it handle e.g. unexpected openers? Some description in the readme and some examples would be good, I think, to help people evaluate this over e.g. parinfer.

borkdude 2025-11-18T00:09:15.109739Z

Can you open an issue with some examples? I’ll add it tomorrow

borkdude 2025-11-19T11:29:02.619629Z

It was easy to do but I didn't do it initially: Parmezan now also supports CLJS

🙏 2
daniel.vieira 2025-11-20T12:36:22.656209Z

OMG this is awesome! Thanks you, sir! Just added it to my workflow, which I sometimes need. 🙏 Also thanks for making it so easy to install with bbin, which I just learned exists.

borkdude 2025-11-20T12:37:16.458929Z

You're welcome :)

2025-11-17T22:12:55.016489Z

https://cljdoc.org/d/io.github.noahtheduke/splint/1.22.0/doc/home: a linter focused on style and code shape splint v1.22.0 After a long slumber, a much needed release with new rules and many bug fixes. • lint/update-with-swap: Prefer (swap! (:counter state) + 5) over (update state :counter swap! + 5). • lint/no-target-for-method: Avoid (.length) and (String/.length) style method calls that lack a target instance. • Exported comprehensive clj-kondo hook for defrule. • New special patterns ?*?, ?+?, and ???, lazy/non-greedy versions of ?*, ?+, and ??. Instead of listing all bug fixes, I'll say in short that the pattern parser is tightened up a bit and added a number of configuration options to many existing rules, making them easier to use.

4
🎉 10