"Why do I like Clojure? I've made a list." I see what he did there.
"I could keep frame rates in the high 20s even with hundreds of objects on the screen. Clojure is not slow." - I think we have very different definitions of "slow". 60fps should be the bare minimum and that should be achievable with thousands of objects on screen. Unless those "hundreds of objects" are doing something really special like ray-tracing or advanced physics, he's at least a couple orders of magnitude too slow.
I love dysfunctional programming.
"Clean Code is the biggest mistake of my life." - Uncle Bob, 2025.
"Smalltalk was image-based". A program never really ever stopped; it only would be paused, i.e. serialized. The IDE and your code were one single program that had been running for years since the very beginning of the smalltalk language interpreter, only being paused (serialized) and resumed (deserialized) as needed.
Idea: snake_case variables are heap allocated (because snakes are found in heaps of wood, etc); camelCase variables are stack allocated (because camels travel in straight lines, like a stack pointer); camel_Snake_Case variables get instantly deleted because it's a terrible way to name a variable.
Clojure has been the most fun I've had in 15 years of programming and is a breath of fresh air.
After some months of developing in a Lisp, the parentheses disappear and you only look at the level of indentation. Especially if using Parinfer for structural editing. It becomes like Python in that respect (except that the parentheses still are there, so in moments of confusion you can always fall back to highlighting the matching parentheses).
after that "high 20s" paragraph... "mom, uncle bob wandered out of the house again! They found him in the supermarket in the frozen food aisle with his pants down!"
I'm a software engineer at a biopharma company, largely building business CRUD web apps. 1 guy on my team is the "abstraction master". You need to dig through 10 files, custom middleware, enums, and verbosity like you couldn't even imagine to debug 1 endpoint. Nounified verbs, factory functions, etc. I blame uncle Bob. You can never figure out how something without devoting an entire day to deconstructing it.
I appreciate Prime taking the time to review this article and giving an argument for something like Clojure a chance. Sadly the article itself, despite making a few good points, felt a bit brief and superficial, making it seem a bit fanboyish and potentially hard for people to take very seriously.
17:27 Don't let Uncle Bob's phrasing mislead you, spec/schema checks are usually separate from traditional style tests. The unit tests aren't the ones doing the type checking. The extra benefit you get from using spec however, is that it allows you to do property based testing (like Haskell's QuickCheck) which automatically generates and runs tests with a random set of inputs and edge cases that meet your specifications. And you can specify your expected inputs/outputs with more granularity than a typical ML style type system like Rust/Haskell/OCaml's (eg. you can specify value level conditions, like valid number ranges, list lengths/contents, substrings, and more), which makes it extra powerful. Not to mention that you can also use spec like a parser library and parse arbitrary text/data with it. There's a companion library (spec-provider) that uses spec to parse any examples of raw data you give it to generate inferred type/content specifications from them (like F#'s type providers) for example, so you don't even have to write those yourself either.
Clojurescript is also where react JSX comes from. Frameworks that wrapped pre JSX react popped up early on and most of what React did to improve DX was to make it more and more similar to the cljs wrappers
What he means by smalltalk being an "image based language" is that smalltalk isn't just a language, it's a whole environment/mini OS of sorts, and you have to build an image of that environment to use it. I personally dislike this, but it allows for some really cool stuff, as the whole environment is smalltalk. You have direct programmatic access to this whole environment and the language itself. Smalltalk has insane metaprogramming capabilities. In a lot of languages you have some sort of basic reflexivity, but in smalltalk you can define metaclasses, or even redefine the concept of a class itself, you can change the whole language if you want, it's smalltalk all the way down. It just has a small bootstrap and everything else is modifiable. It's an interesting language for sure, though outside of the assignments I had to do with it, I wouldn't build stuff with it.
I think I will give Clojure a go some day, seems quite nice. I think the way Uncle Bob presented it is pretty bad though, you can achieve this syntax in many other languages. In Julia you have several options: map(x -> x^2, 1:25) (x -> x^2).(1:25) 1:25 .|> x -> x^2 ... or for loops which actually gets vectorized (looking at you, Python): [x^2 for x in 1:25] I do understand that multi-paradigm languages can end up doing more harm than good by having all these options, but having the choice between tidy for-loops and functional style maps at the same time is appealing to me.
Clojure is an AMAZING language. Absolutely worth anyone's time
Clojure is an outstanding language. Once you get use to Lisp like languages it's hard to look at other languages the same. If there were more professional opportunities around it I would go there and never look back.
Yeah going from clean-code-verbosity to one-liners-that-you-need-an-article-to-explain was quite a change in pace ngl
Really good editing on this. I appreciated how many quick cuts and almost no downtime at all. Thanks for putting this out!
@PledgeBass