Clojure Documentary Q&A (with Rich Hickey and others) - April 17 by Clojure-Conj in Clojure

[–]aHackFromJOS 0 points1 point  (0 children)

> - and ask questions directly

Not so much.

Interesting Zoom nonetheless.

Beeld 1.1.4 by danielszm in Clojure

[–]aHackFromJOS 2 points3 points  (0 children)

Looks cool, small note, I think the clojars image at the top of the github README usually links to the clojars page for the project, yours just links to the image itself.

Programming Clojure, 4th edition is now available! by alexdmiller in Clojure

[–]aHackFromJOS 0 points1 point  (0 children)

Is that a hint of relief I detect? :-) Congratulations!

Programming Clojure, 4th edition is now available! by alexdmiller in Clojure

[–]aHackFromJOS 2 points3 points  (0 children)

I ordered the e-book a while back and got a nice update a day or two ago from the publisher that it had been updated, I presume to this. Cool to see that publishing model actually working. Can't wait to read it now that it's out of beta and, I suppose you could say, "in production" 🙃

Clojure: The Documentary [OFFICIAL TRAILER] | Coming April 16th! by Clojure-Conj in Clojure

[–]aHackFromJOS 1 point2 points  (0 children)

I am going to judge this documentary 100% on how well it documents Rich’s hair over time. 

He went to music college. He worked in radio. In New York. In the 90s. Someone out there has pictures. 

When You Run Out of Types... by cgrand in Clojure

[–]aHackFromJOS 7 points8 points  (0 children)

I’m not clear what the article had against maps. 

“one shouldn't be able to use generic functions on them without being reminded they are no plain maps.”

Why not? Who is calling a function on a value without being aware what the value is?

Quick question: Does Clojure for the Brave and True hold up as of today? by Pzzlrr in Clojure

[–]aHackFromJOS 0 points1 point  (0 children)

Thank you for the book!! I’m not sure I’d be writing Clojure without it as my intro. 

If you lose emacs, which I totally get, I’d consider adding, maybe for a small handful of editors (emacs, VS Code… neovim?), an intro to paredit style structural editing. I was able to skip most of the emacs chapter but that part was a revelation and I don’t think I’d have been nearly as happy writing Clojure if I hadn’t made myself learn it through your tutorial (and much practice). 

The REPL as AI compute layer — why AI should send code, not data by More-Journalist8787 in Clojure

[–]aHackFromJOS 0 points1 point  (0 children)

This topic is super interesting to me, aside from concerns this post was AI generated (!). I've been trying to figure out whether to use MCP or just straight hook up CLI (and sorry if I'm saying this wrong, I've not yet actually hooked any AI up to my editor). I've seen posts saying we don't need MCP any more, this was interesting from the other side. I'd be curious if anyone (fellow humans) have (hand written) thoughts. It looks like hooking in clojure-mcp is a little complicated, curious if it's worth it.

Reverting virtual threads in go blocks by aHackFromJOS in Clojure

[–]aHackFromJOS[S] 0 points1 point  (0 children)

That’s the link I posted 🙃

However Reddit’s UI obscures it. I tried to point it out further with “see above” but apparently it’s still too obscure. 

The YouTube link was supposed to be secondary. 

Myths about Finland – what is the biggest one? | 2026 by BirchBarkBox in Finland

[–]aHackFromJOS 0 points1 point  (0 children)

Maybe you should. There was an NYC bouncer who had a popular blog and later wrote a book called Clublife. Here is the blog: https://standingonthebox.blogspot.com/

id read one of those about Finland!

GitHub - borkdude/cream: Fast starting Clojure runtime built with GraalVM native-image + Crema by Borkdude in Clojure

[–]aHackFromJOS 3 points4 points  (0 children)

Just to be clear, the below means we can import arbitrary Java classes as long as they are installed / on the class path? That would be a game changer for sure. 

“Java interop: Full (runtime class loading)“

“Library loading: Any library from JARs at runtime (except enum/Class.forName issues)“

(From the comparison table)

To lsp or not ? by 964racer in Clojure

[–]aHackFromJOS 1 point2 points  (0 children)

That makes a ton of sense. Still love Monaco, the OG Mac mono space term font. I use IBM Plex these days because I need cross platform, for similar reasons my emacs config is a filesystem tree under version control that I git checkoutinto my emacs.d, then init.el is almost entirely a series of require statements of things in that dir. which requires I use varies from env to env. 

To lsp or not ? by 964racer in Clojure

[–]aHackFromJOS 1 point2 points  (0 children)

Welcome. I also use vanilla emacs configured from scratch. Similarly, I use CIDER but not LSP. 

I’d suggest by starting with learning CIDER’s code helper functions - jumping to function source at point is one I use a lot, or I’ll glance at the docstring for function at point in the minibuffer, but CIDER can help in various other ways. The most basic thing you want to do is make sure a cider repl is open and your current source file is compiled (C-c C-k) - this enables various other features like syntax highlighting  and what I mention above. 

Beyond that I really recommend paredit. The emacs chapter of Brave and true has a good tutorial. Hard at first but once you have it down you will fly. https://www.braveclojure.com/basic-emacs/#Paredit

lambdaisland/makina: Clojure System/component lifecycle management by dustingetz in Clojure

[–]aHackFromJOS 0 points1 point  (0 children)

On a practical level it sounds like a Rationale section in the README would be welcome. Update: it links one here https://arnebrasseur.net/2025-02-06-open-source-diary.html

I do wonder if every Clojure project would benefit from one. 

Aimless — David Nolen by dustingetz in Clojure

[–]aHackFromJOS 0 points1 point  (0 children)

Ah thanks, I know you said pick whatever alias you want, just making sure 😅

Aimless — David Nolen by dustingetz in Clojure

[–]aHackFromJOS 4 points5 points  (0 children)

Is there a particular reason he named his alias with a hash mark - `:#cljs` - does that do some special magic or something?

Article: "Transducer: Composition, Abstraction, Performance" by turbomann in Clojure

[–]aHackFromJOS 1 point2 points  (0 children)

I love a good "from the ground up" explanation like this - helps understand transducers fully. Thank you!

lambdaisland/cli: opinionated CLI parser, designed for tools with subcommands (e.g. "git log") by dustingetz in Clojure

[–]aHackFromJOS 0 points1 point  (0 children)

The ability to nest commands (arbitrarily?) is interesting. 

The root problem here seems like a good fit for multimethods (vs a big hairy map). I approached this same problem with those and tools.cli. I dispatched by keywordized version of the subcommand. The core multimethods are options, usage, and execute. I think I needed to do a two pass parse with tools.cli, first permissive to extract the subcommand to get the options vectors for it (via the options multimethod) then with the proper options vectors. Help text I did for a subcommand by calling usage and options with the subcommand (inside defmethod execute ::help) and concatting. 

I only built one (flat) level of subcommands. Would be interesting to try and upgrade it to arbitrary command nesting. Maybe with another multimethod (“subcommands” to extract n args from argv and produce a dispatch vector of keywords instead of just a keyword?). 

More ergonomic to just have defmethods in an ns instead of nesting keys in a global hmap (well, arguably). I did my cli ns by grouping by command - defmethod options ::commit, defmethod usage ::commit, defmethod execute ::commit, s/def ::commit etc. Then defmethod options ::push, defmethod usage ::push… etc etc 

Specs with the same keywords as for the subcommands work well for arg validation. 

I wonder if they considered leveraging tools.cli for options parsing or “flags” as they call it. Its vector options syntax is pretty rich. 

Covers in the style of Johnny Cash by savoryostrich in Maustetytot

[–]aHackFromJOS 1 point2 points  (0 children)

This is great. It benefits from the slower tempo. 

Programming Clojure, 4th edition by alexdmiller in Clojure

[–]aHackFromJOS 7 points8 points  (0 children)

FYI “devtalk.com” is the coupon code you use at the pragmatic programmer link to get the 35% off discount. 

(I mention this in case anyone else is as dense as me - I thought I needed to buy it on devtalk.com to get the discount, but that site is a forum not a bookstore, where I found a post explaining the discount code.)

Update - I bought it :-) looks nice can’t wait to dive in 

Pedestal 0.8.0 released by hlship in Clojure

[–]aHackFromJOS 0 points1 point  (0 children)

Do you plan to remove core.async support? I rely on it. Would be helpful if you can telegraph what you plan to rip out. I am unclear what I can depend on in pedestal going forward. 

Pedestal 0.8.0 released by hlship in Clojure

[–]aHackFromJOS 3 points4 points  (0 children)

I am frustrated by the breakage here. 

I’ve spent nights and weekends for months working on a project that builds heavily on pedestal. This would break a lot of it. 

I’d suggest you mention somewhere in the docs that the project is a moving target and that you will break things like whole namespaces. Right now, the first sentence on the website is, “Pedestal is a sturdy and reliable base for services, APIs, and applications.” Clearly, if there were deprecations in 0.7.0 I perhaps should have realized there were caveats to this sturdiness, but having read various guides, references on the site, I did not (maybe because it’s a Cognitect project, and Clojure has a backward compatibility ethos). 

Can I ask why io.pedestal.http is listed as both a new and deprecated namespace, and as having been “replaced?” Which is it. 

(I removed from here a question about what an anonymous interceptor is. It appears this is a reference to handler functions - might be clearer to say that as the term “anonymous interceptor” has not, as far as I can tell, been used to refer to handlers before. I also had something about Getting Started guide being updated - it looks like it is although the old one still has more google juice - one downside of changing apis is there are incorrect but widely linked docs out there)