It really can't be understated how respectable it is to not only be open to and try something that contradicts your beliefs - But to then write a whole article about it and share with everyone that something you've been publicly known to not believe, you now believe.
Yes, I think this comes with education and/or experience, where you work with things you don't understand and need to grasp. Like you are wrong all the time.. there won't be progress if you just be an stubborn ass. Maybe that is one of the biggest factors in why everything is so fucked to day (people who don't know, refusing to acknowledge the thing does not work and not being able to evolve to better things for petty ego)... or something :D Really like the attitude Primeagen has... not on pedestal.
"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.
For real! I've never done a full professional project in Clojure, I've only used it for side projects, but I'm so much more productive in it than any other language I've ever written in.
Programmable semantics for the win: You can redefine defn, let, cond, the variable setters/getters, etc... locally or globally to do stuff you want like add debugging information, do dependency resolution, notify/update, persistance through files/database. Clojure's protocols seem to be more general than OOP. REPL based development. LISPs regular grammar means stuff like parinfer / paredit are possible.
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!"
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.
"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.
@@JasminUwU That's a very easy thing to solve. You just add a WAL log so intermediate changes aren't lost, and can be recovered on next startup after a crash.
@@JasminUwU Actually you can hibernate windows, or even sleep. Also in Lisp/clojure for persistance you can change the meaning of define/assignment statement (set!/setq/setf) so that it saves variables to a file/database or maybe even loads the previous variable every time you change it sort of like getters/setters but for all assignment in your program.
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).
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
That's crazy if true. I definitely remember learning about HMR with figwheel before it became more popular and less hacked together prior to webpack. Learning Reagent was easier than react for me (partly because redux).
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.
Superficial implies the artical made deerp claims and failed to dive past the surface to reach them. What deeper claims did you see being made? What i heard him clearly express that this was his opinion.
I've said this before, but after a bit the Parens Spam disappears and you just see the code, same as all the other syntax sugar from other languages - with the advantage that you never have to backtrack to figure out order because in a decent LISP, everything is prefix operator. Infix operator maths is honestly hard to read these days. Why the fuck would I want to write bar = x + y + w + z; when i can (+ x y w z). That only becomes more true as complexity increases. Also, it's become a chore to relearn the latest and greatest result of Greenspun's Tenth Rule (this time it doesn't suck, we swear) I'd rather just use the superior original.
Racket is the result of a similar rule, Every reasonably sized Scheme program contains a bug ridden slow implementation of half of Racket, including Racket!
In math itself they define the + operator as a function from R×R to R as +(x,y) and say that just for the convenience or tradition it is written as x + y instead, But every Foundational Math textbook will say that +(x,y) is the real thing and with this notation the addition operation is defined/constructed which in lisp notation will translate into (+ x y), So lisp is actually much closer to the original notion.
@@astroid-ws4py "n math itself they define the + operator as a function from R×R to R as +(x,y) " No, they don't, they define it as a function whose domain is R (R^n, or N, or C, or whatever) and whose codomain is R (or whatever). Notation is not part of the definition. Postfix is way better than prefix anyhow.
@@isodoubIet The operation is defined as +(x,y) and only for the tradition they write it as x + y, You can check yourself the many books about foundations of mathematics and how they construct the + operation directly from bare principles from the naturals and up. So lisp is closer to the original notion syntactically.
@@astroid-ws4py "The operation is defined as +(x,y) a" I literally just explained that it isn't. You're confusing the concept of "binary function" with "function notation" which is totally unrelated. I could for example write a function like this: x y f z to indicate what we would normally write as z = f(x, y) and there's nothing you could do to prove that's wrong. Why? Because it's notation, and notation is irrelevant except for human convenience. Might as well say that functions are conventionally defined in Times New Roman and that writing them in Arial is wrong. Has about the same amount of meaning as your complaints about infix vs prefix.
It's really not it's awful. Had to use it for a master's degree course because the professor was a hipster that never wrote an app that went to production, and it was so bad. I just ended up writing it in C# and translating it to clojure got the best grade in the class because my code was the only one that didn't turn into a mess with a bunch of files and functions you couldn't figure out what were they meant to do.
@@FilipCordasi am not one to diss languages but since you started. C# is an ok language at best. Does it do web very well? No. Does it do data science very well? No. Does it have a thriving open source community? No Does it do CLI apps for well? No Does it do mobile very well? Xamarin, nuff said Linq is the best thing that came out of that team and it is a functional paradigm so yea
@@FilipCordas I had a similar experience. In my masters course I had a curmudgeonly professor who hated all languages that weren't backed by a big corporation. I ended up writing assignments in Clojure and translating them into C# because my code was the only one that didn't turn into a mess with a bunch of files and classes you couldn't figure out what they were meant to do. See what I did there? I'm interested in if you have any deeper criticisms of the language. To me, and correct me if I'm wrong, it sounds like you didn't have a good LSP at the time and didn't follow clojure best practices. There was a time when clojure tooling wasn't that great, but in the modern day we have much better tooling like clojure-lsp, clj-kondo, and great editor integrations. Clojure does take some time to get used to, this I fully admit, and it's not going to be everyone's cup of tea, but for me it has provided an amazing concurrency model, a solid foundation of functional programming, a better understanding of domain modeling (I
@@MrSMGun C# is not anyone's choice for an amazing language, that is true. But at least it is a _functional_ language (in the sense that it gets the job done) instead of a dynamically typed mess of parentheses useful only for ineffectual pottery and grandstanding.
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.
@@isodoubIet Every language has some kind of parser. In case of Lisp it's just a simple parser, which is not really related to the semantics. It only parses lists, and the semantics are defined in terms of these lists. I also don't think, Lisp is necessarily about the syntax. You could have Lisps using totally different Syntax, as long as they are internally parsed as lists (preferably stored as arrays, not linked lists).
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.
@@vikingthedude There's a good article called "What Clojure spec is and what you can do with it (an illustrated guide)" that covers it pretty well. That, plus the official spec guide and Rich Hickey's "Spec-ulation" talk are good starting points.
i’m 90% sure that you can have the granularity in inputs/outputs that you talk about with quick check in haskell… i think i actually did that while writing parser tests…
@@rogergalindo7318 of course, but that granularity isn't limited to property testing situations with spec. You'd have to use something like Idris to get overall feature parity with what spec offers in the static world.
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.
When I first went to college and took my first programming course they wanted us to learn Scheme, another lisp dialect. And I just didn't understand anything and it turned me off from computer programming for 4 more years until I found c style languages that just work more like my brain does. "Just do a base condition and call the program again" like what don't you get? I've recently rediscovered functional programming in ocaml and haskell, but the initial effect on me was what the fuck is this. I think a lot of people have to love c style first before moving to functional programming.
I knew I started watching you for a reason. Your despise of bracerless singular statements confirmed my suspicion, because I’ve been shouting that from the rooftops to anyone who’d listen (and my girlfriend, who doesn’t program but lets me rant and says “that’s nice, dear”) for years!
@@BosonCollider No, they're just not for everyone and everything. Also because they sound good to some people in theory doesn't mean they're actually that useful. There's nothing stopping them for becoming more mainstream .... Any popular compilers written in them ? Office suites maybe ? Browsers ? Popular web frameworks ?
That stands to reason (lame pun intended) because you can view Hindley-Milner style type inference as logical inference. In fact, I have found it helpful to view Haskell typing (which is Hindley-Milner, but generalized with ad-hoc polymorphism and whatnot) as specifying a kind of Prolog program which the compiler runs first to produce (either a type error message or) the actual code which is finally compiled.
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.
Smalltalk took its image based development from Lisp and programmable semantics, and EMACS is kinda of a Lisp/image or Lisp machine. BTW programmable semantics like being able to change the meaning of cond, set, defun, let were sort of what the early definition of object oriented were (i.e: the semantics are objects in the code that can be changed).
I would argue that the term "large systems" in itself vague and ambiguous. There are complex systems, and many, if not the most of the systems are more complex than they supposed to be. There are high load systems, but high load doesn't mean that the system is complex. So the right question should be "what complex by necessity systems did he build, not over engineered".
@@amrojjeh It is pretty nice. I'm currently learning Pharo, which is a type of Smalltalk, but it has some issues integrating in my environment. Also, if you're used to type systems, the optimal programming route seems mental, but it works if you can force yourself to forget everything you learned before.
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.
In his book he talks about not repeating the same switch statement all over the place and using polymorphism in stead. In Martin Fowler's refactoring book similar advice is given. I'm assuming this is not what you are referring to? As imho this advice still holds in many contexts...
I really like the argument you make 'what I think is good is really what I think is familiar', this is part of why I often use a bunch of random programming languages or technologies. When I was still a baby dev I fell into the trap you mentioned here for years, I mainly stuck with Python and didn't understand why people liked things like a type system. Only after actually using things like TypeScript and Rust I finally started to understand and I became a better programmer because of it!
Uncle Bob strikes me as desperately wanting to find the "one true language" that can be used for everything, so he can run to the UN, petition flapping in hand to try and legislate that all software written from that point on must be written in that "one true language" in the way that he deigns correct.
yea that's essentially what he said in one of his videos; he seems to want the government to mandate the tools we use, which is absolutely absurd, especially with a dynamically typed gc'ed slow language.
@@carlpittenger You can embed C/Rust into Clojure btw, you can also use a quasi-quote custom compiler macro thingy in a few lines to convert Clojure code into Rust code.
I really enjoy trying out different languages. I’ve gotten around to 20+ in the last year. For some reason, Clojure always feels very natural to me. I can’t explain why, it just works for me. Also, I really enjoy Rich Hickey’s take on things; it usually makes me think.
Get rekt y'all lisp haters. We knew from the start the power lisp and its dialects had. "Any sufficiently complicated C or Fortran program contains an ad hoc, informally-specified, bug-ridden, slow implementation of half of Common Lisp."
14:32 Exactly the point the creator of Clojure makes in `Simple Made Easy`. I love clojure the language, even compared to a very similar language like elixir. But I cannot deny that the library system is too fragmented, there is no consensus, apart from if this is good or bad, it's very hard for beginners. That’s why I think clojure tends to be appealing for long time programmers. There is also Datomic, which is a very cool concept of a database.
11:20 And that's why you never put the { at the and of a line, but only as the first non whitespace char of the line. So you see when it's not there. (But it should be there anyway.)
Could you put the articles in the description? Like i get it i could probably just find it from the video, but it'd be nice to just have a direct link in case I want to check out the article/other stuff the guy has done. Thanks :)
Clojure has its issues (which language doesn't?), but in the grand scheme of things it is a rather beautiful/elegant/stable language, that will make you realise how little (if any) mutable state you actually need (amongst other things). You should definitely check it out - you will NOT regret it, especially given how much you dislike immutability...
One thing he seems to forget is, how easy is it to read for other programmers. Your likely to read more code than writing it Sure it can be nice to write fast, but it also needs to be maintainable.
Who cares about that ? Here I wrote this nice clean, succinct code which not even I will understand in one year but doesn't it look cool ? For people who need to understand this afterwards ... well it's their problem , right ? I've seen numerous issues with this where you have a 2 line expression but why write some if and else when you can ? and then some = and some more == ....
If I didn't use curly bracket in loop, I usually just write it beside the loop itself so I won't mistake it inside curly bracket when I want to add code. Not that I support it, I'm just lazy sometimes
20:00 I think this is not always true as there are new academic concepts sometimes explored in new langauges and these usually trickle down eventually to more mainstream languages.
9:37 so many parenthesis... Can we stop complaining about parenthesis? Because this would be the same in C or whatever: println( take( 25, map( square, range()))); How many parens ? YES
When did Dr Disrespect get into programming? Ok, i'm sure i'm not the first to make that joke. I have to say, you are a programmer I can stand to watch. Very entertaining. Not cocky or dogmatic. Seem to be quite knowledgeable. Subscribed.
5:00 It makes sense you need a _list_ of reasons to use lisp, the same way there is an _array_ of applications and OSs written in C and multiple innovative attack _vectors_ for any new C++ construct
"framerates in the high 20s"... Oh man... Say what you will about Uncle Bob, but this article is absolutely hilarious, probably the best joke he's ever made. Edit: Seeing some people in the comments taking him seriously, as if he is serious here, no this is very much trolling. I've seen the Casey video and a video on their email correspondence, but this article is a shitpost, you can't tell me otherwise.
I learned Common Lisp for my Machine Learning class in college a few years ago and was surprised at how suspiciously simple it was to do things with it, however fast or slow it may have been, compared to other languages I already knew at the time like C++ or even JavaScript and PHP at the time (2017). The final project was to implement a solver for the game "Mastermind" and we were graded based on the order in which our groups of three or four took the most rounds to timeout our solving algorithms as the number of colored pegs to guess increased. IIRC my group finished 5th or 6th in the class even with our fairly naive mostly brute force approach that kinda looked like baby's first bubblesort but Lisp.
I like Bobs comment on speed. I’m a huge fan of the lisp family of languages (since the early 80s). The high performance of Lisp comes in part from its limited syntax and semantics. It relies on fewer constructs, which have been made very robust and speedy. You do need to process more code is the trade off.
I'd love to see someone solve the small syntax static typing problem. The ML family gets close, but I would consider that to be a rather midsize syntax. With Lisps you can just throw macros at the problem, but when everything is just symbols and s-expressions it all blends together.
It's all bit soup in memory. The goal of static typing isn't to keep the square peg from fitting in the round hole. The point is more along the lines of slapping your two year old's hand when they try to put the square peg in the round hole. I don't know where I was going with this, I just have invasive thoughts.
*Programming will forever suck, that's all there is to it. It is just always going to suck, why are you trying to make it not suck? Just accept the suck and determine which version of suck you want to suck on* - ThePrimeagen, 2023 This is actually crazy 🤣🤣🤣🤣🤣 EDIT: I swear the ending got me rolling, didgn't expect that.
Bob saved the OOP world with his "Clean Code". Now he transitions to the functional programming camp where he will sell books and trainings on how to write "Clean Functional Code". After all he has done functional style programming in Assembler, Fortran, COBOL, Java, C, C++, SQL, Prolog, Python, C#, Smalltalk, Swift, JavaScript, Dart and Rust.over the last 40 years.
I like how Clojure is "The bestest language evar!" for people who used to code on Java. In a Bizarro-world version Mark Seemann praises F# as the new gospel. This parallel cracks me up for some reason.
I had to use lisp in college, really liked it. Map, reduce and such functions made sense to me once I tried lisp. It's just cool to have more experience on the functional side of programming :)
programming in Clojure daily for the past decade almost and I've never been happier. started with BASIC on ZX81, then Forth & Z80 assembly on ZX Spectrum, Pascal & x86 assembly on DOS Delphi on Windows, then awk, bash, grep, Microchip PIC assembly, 7 years of vim, GNU Forth on Linux, REBOL, Ruby, Node, Solidity and "finally" Clojure with IntelliJ+Cursive (with some Emacs/CIDER keybindings), which is the most convenient bloatware of our times overall.
The prophecy of Brian is turning out to be really true, because you know it is Uncle Bob of Clean Code™ liking a language from a programming paradigm that by its very nature despise the rules of clean code.
What?! Uncle Bob loved Smalltalk then moved to Clojure. Smalltalk's version of OOP is very very different from Java/C++/C# ManagerFactory class inheritance BS. In Java doing OOP meant doing "cargo cult" programming having your control flow be split apart, using mutable state, having lots of code, etc... Smalltalk had 1st class functions, 1st class conditionals, metaclasses, actual message passing, Alan Kay always bragged that he could build programs in 5-10x fewer lines of code than in Java in Smalltalk.
One thing to add to the editors part is that using an editor that has some form of structural editing either built-in or as a package is a gigantic advantage when writing Lisp.
For IDE support, if you like VS Code, there is Calva. (Yes, I'm biased.) And for those who like to hack their editor in user land like you can with Emacs, there is Joyride doing the same thing for VS Code. By some strange coincidence the language used by Joyride to hack VS Code is Clojure. =)
11:20 rant ....i think its neat feature, if you have simple condition much like && in bash ...you simply put it right next to it. Everyone reading it should instanlty understand that this doesnt branch the program, its more like "do this one this if condition matches". I never used it with loop tho ...but its very popular syntax and if someone doesnt understand it i think this isnt your fault for writing it. They should know it. Its clean syntax where instead of writing 3 lines you write it all in one line (or 2 if its very long, which is rare in my experience). And if need arises where more statements belong in this, it suddenly becomes "branch of program" where you put curlies around. It makes it easier to read and if noobies dont get it that isnt something you should be concerned about in the first place. They should learn and this will be just one little small thing in their giant list of "things to learn"
I have no idea why it happens. But every single time Prime says, "pound me daddy" and "CLO-JUR" I laugh. I thought it would stop being funny but it doesn't. I'm watching this on loop for 2 days and laughing. I think i need help.
The Finnish company Metosin created a spec alternative called Malli. Its pretty fun to use once you get used to it and I prefer it over spec tbh. For the nested functions-lists, all those parentheses, you can use the threading macros to help you out, stuff like thread first -> and thread last ->> . I cant live without my Clojure REPL hahaha . Stockholm Syndrome Language indeed... haha
If you don't know what image in Lisp languages is, maybe you should look it up before continuing rambling on. Yes, Smalltalk had it too. Go look it up.
To be fair back in the 80s and 90s compilers would generate different code when you didn't use { or if you did. So programmers were encouraged to not use them.
15:40 if you do math a lot, you will have functions within functions within functions within functions. It's normal. Talking about parentheses is quite parenthetical to the main subject.
I'm just a hack hobbyist who uses programming as my version of crossword puzzles to keep my old addled brain spry. But in my novice experience watching the pantheon of programming gods arguing like Beverly Hills Housewives, my piddly conclusion is that programming is not much different from politics. We all assume the greater good is the ends, but we'll gladly kill each other during the means.
"Why do I like Clojure? I've made a list." I see what he did there.
He should have made a vector instead, that's more idiomatic in Clojure.
@@fredoverflow I loved your video on transducers from the ground up by the way. Really great stuff :).
Indeed, one whose CDR was nil
@@zsladePlethora! (That means a lot.)
You beat me to it. Congrats.
It really can't be understated how respectable it is to not only be open to and try something that contradicts your beliefs - But to then write a whole article about it and share with everyone that something you've been publicly known to not believe, you now believe.
If only our politicians were like that.
Yes, I think this comes with education and/or experience, where you work with things you don't understand and need to grasp. Like you are wrong all the time.. there won't be progress if you just be an stubborn ass. Maybe that is one of the biggest factors in why everything is so fucked to day (people who don't know, refusing to acknowledge the thing does not work and not being able to evolve to better things for petty ego)... or something :D Really like the attitude Primeagen has... not on pedestal.
"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.
Exactly. I also found it weird. My dude Uncle Bob is still living in the 80s.
yeah, i thought so too. I can write faster programs in python.
@@arkie87 So what. I can write faster programs in Clojure if I want. You can interop with Java or even C if you want, like in Python.
I presume he was running it on a cpu
Clojure has been the most fun I've had in 15 years of programming and is a breath of fresh air.
For real! I've never done a full professional project in Clojure, I've only used it for side projects, but I'm so much more productive in it than any other language I've ever written in.
I've been working for 2 years now oe fullstack clojure project. It never stops being fun
Programmable semantics for the win: You can redefine defn, let, cond, the variable setters/getters, etc... locally or globally to do stuff you want like add debugging information, do dependency resolution, notify/update, persistance through files/database. Clojure's protocols seem to be more general than OOP. REPL based development. LISPs regular grammar means stuff like parinfer / paredit are possible.
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!"
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.
Someone suggest this to the bird lang people
I'm sure Tom would only use underscore, he's such a genius.
typedef int _;
_ ___ = 42;
_ ____ = 69;
printf("%d + %d = %d", ___, ____, ___ + ____);
What about single word variables? Are they considered snake_case or camelCase?
@@ficolas2 they'd be constants, not variables
@@ficolas2I was about to say this is an interesting idea until I saw your comment 😅
"Clean Code is the biggest mistake of my life." - Uncle Bob, 2025.
LOL.
Also FR.
No such thing as clean code. Code should be clear, not clean
Clueless haters.
I wish
@@nandoflorestan at least I have my own opinion, based on my own experience and not following anyone like a lemming
"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.
Smalltalk could've become a thing if ram wasn't volatile
@@JasminUwU That's a very easy thing to solve. You just add a WAL log so intermediate changes aren't lost, and can be recovered on next startup after a crash.
@@JasminUwU Actually you can hibernate windows, or even sleep. Also in Lisp/clojure for persistance you can change the meaning of define/assignment statement (set!/setq/setf) so that it saves variables to a file/database or maybe even loads the previous variable every time you change it sort of like getters/setters but for all assignment in your program.
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).
I agree. It looks ugly to the Algol family lovers initially and then it all melts away.
I like to use rainbow parenthesis. Helps a lot.
I love dysfunctional programming.
It is both functional and dysfunctional 🤔
The code I write the most is dysfunctional!
@@Wherrimyits also known as transcendental programming. it transcends binary polarities.
Yeah going from clean-code-verbosity to one-liners-that-you-need-an-article-to-explain was quite a change in pace ngl
I'd rather read assembly than Clojure.
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
That's crazy if true. I definitely remember learning about HMR with figwheel before it became more popular and less hacked together prior to webpack. Learning Reagent was easier than react for me (partly because redux).
I thought jsx came from xml
source?
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.
to be honest, to me, the article sound sacastic
@@hck1blooddayUncle Bob has a whole video series about solving Euler project tasks on his Clean Coders channel. It's 100% serious 😂
Superficial implies the artical made deerp claims and failed to dive past the surface to reach them. What deeper claims did you see being made? What i heard him clearly express that this was his opinion.
just like clean code
@@DrewIsFail No deep claims, but simply as an article advocating for Clojure as a programming language, I felt it lacked depth to meet that objective
I've said this before, but after a bit the Parens Spam disappears and you just see the code, same as all the other syntax sugar from other languages - with the advantage that you never have to backtrack to figure out order because in a decent LISP, everything is prefix operator.
Infix operator maths is honestly hard to read these days. Why the fuck would I want to write bar = x + y + w + z; when i can (+ x y w z). That only becomes more true as complexity increases.
Also, it's become a chore to relearn the latest and greatest result of Greenspun's Tenth Rule (this time it doesn't suck, we swear) I'd rather just use the superior original.
Racket is the result of a similar rule, Every reasonably sized Scheme program contains a bug ridden slow implementation of half of Racket, including Racket!
In math itself they define the + operator as a function from R×R to R as +(x,y) and say that just for the convenience or tradition it is written as x + y instead, But every Foundational Math textbook will say that +(x,y) is the real thing and with this notation the addition operation is defined/constructed which in lisp notation will translate into (+ x y), So lisp is actually much closer to the original notion.
@@astroid-ws4py "n math itself they define the + operator as a function from R×R to R as +(x,y) "
No, they don't, they define it as a function whose domain is R (R^n, or N, or C, or whatever) and whose codomain is R (or whatever). Notation is not part of the definition.
Postfix is way better than prefix anyhow.
@@isodoubIet
The operation is defined as +(x,y) and only for the tradition they write it as x + y, You can check yourself the many books about foundations of mathematics and how they construct the + operation directly from bare principles from the naturals and up. So lisp is closer to the original notion syntactically.
@@astroid-ws4py "The operation is defined as +(x,y) a"
I literally just explained that it isn't. You're confusing the concept of "binary function" with "function notation" which is totally unrelated. I could for example write a function like this:
x y
f
z
to indicate what we would normally write as z = f(x, y) and there's nothing you could do to prove that's wrong. Why? Because it's notation, and notation is irrelevant except for human convenience. Might as well say that functions are conventionally defined in Times New Roman and that writing them in Arial is wrong. Has about the same amount of meaning as your complaints about infix vs prefix.
Clojure is an AMAZING language. Absolutely worth anyone's time
It's really not it's awful. Had to use it for a master's degree course because the professor was a hipster that never wrote an app that went to production, and it was so bad. I just ended up writing it in C# and translating it to clojure got the best grade in the class because my code was the only one that didn't turn into a mess with a bunch of files and functions you couldn't figure out what were they meant to do.
@@FilipCordasi am not one to diss languages but since you started. C# is an ok language at best.
Does it do web very well? No.
Does it do data science very well? No.
Does it have a thriving open source community? No
Does it do CLI apps for well? No
Does it do mobile very well? Xamarin, nuff said
Linq is the best thing that came out of that team and it is a functional paradigm so yea
@@FilipCordas Well, I have shipped lots of apps, and I think clojure is pretty great. It's not easy, though.
@@FilipCordas I had a similar experience. In my masters course I had a curmudgeonly professor who hated all languages that weren't backed by a big corporation. I ended up writing assignments in Clojure and translating them into C# because my code was the only one that didn't turn into a mess with a bunch of files and classes you couldn't figure out what they were meant to do.
See what I did there? I'm interested in if you have any deeper criticisms of the language. To me, and correct me if I'm wrong, it sounds like you didn't have a good LSP at the time and didn't follow clojure best practices. There was a time when clojure tooling wasn't that great, but in the modern day we have much better tooling like clojure-lsp, clj-kondo, and great editor integrations.
Clojure does take some time to get used to, this I fully admit, and it's not going to be everyone's cup of tea, but for me it has provided an amazing concurrency model, a solid foundation of functional programming, a better understanding of domain modeling (I
@@MrSMGun C# is not anyone's choice for an amazing language, that is true. But at least it is a _functional_ language (in the sense that it gets the job done) instead of a dynamically typed mess of parentheses useful only for ineffectual pottery and grandstanding.
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.
Exactly my experience too. I dread seeing other languages these days.
Eh, I don't really like that it's only a pseudolisp. I also prefer lisp-2 but that's just taste.
So baby pull me clojure to the backseat of your compiler.
It's hard to take seriously languages that consider not having a parser to be an advantage.
@@isodoubIet Every language has some kind of parser. In case of Lisp it's just a simple parser, which is not really related to the semantics.
It only parses lists, and the semantics are defined in terms of these lists.
I also don't think, Lisp is necessarily about the syntax.
You could have Lisps using totally different Syntax, as long as they are internally parsed as lists (preferably stored as arrays, not linked lists).
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.
That’s amazing. I’m looking to learn more intermediate level clojure. Is there any good resource to learn spec that you know of?
@@vikingthedude There's a good article called "What Clojure spec is and what you can do with it (an illustrated guide)" that covers it pretty well. That, plus the official spec guide and Rich Hickey's "Spec-ulation" talk are good starting points.
Thank you
i’m 90% sure that you can have the granularity in inputs/outputs that you talk about with quick check in haskell… i think i actually did that while writing parser tests…
@@rogergalindo7318 of course, but that granularity isn't limited to property testing situations with spec. You'd have to use something like Idris to get overall feature parity with what spec offers in the static world.
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.
You're blaming the wrong people. Javaisms were a thing before, and independently of, uncle Bob's success.
@@nandoflorestanthey just formalized everything in a book which every company forces juniors to read
Don't blame Bob. Blame your guy one your team, and Bob. lol
Engineers should know better than follow ideologic dogmas.
People should be reading John Osterhaut's A Philosophy of Software Design instead of Clean Code.
You saw that one article “it’s time to stop recommending clean code” say that and now you are regurgitating it. Have you personally read that book?
Really good editing on this. I appreciated how many quick cuts and almost no downtime at all. Thanks for putting this out!
When I first went to college and took my first programming course they wanted us to learn Scheme, another lisp dialect. And I just didn't understand anything and it turned me off from computer programming for 4 more years until I found c style languages that just work more like my brain does.
"Just do a base condition and call the program again" like what don't you get?
I've recently rediscovered functional programming in ocaml and haskell, but the initial effect on me was what the fuck is this. I think a lot of people have to love c style first before moving to functional programming.
I knew I started watching you for a reason.
Your despise of bracerless singular statements confirmed my suspicion, because I’ve been shouting that from the rooftops to anyone who’d listen (and my girlfriend, who doesn’t program but lets me rant and says “that’s nice, dear”) for years!
Listening to Prime say "# me daddy" is so awkward. Speakers booming at my parents' house.
This is why i can’t watch prime in my living room
I actually know a programmer who wrote a whole compiler for a functional language with type inferencing in Prolog in a few weeks.
Logic programming languages are incredibly underrated
@@BosonCollider No, they're just not for everyone and everything. Also because they sound good to some people in theory doesn't mean they're actually that useful. There's nothing stopping them for becoming more mainstream .... Any popular compilers written in them ? Office suites maybe ? Browsers ? Popular web frameworks ?
Yeah, really looking forward to using that instead of GCC 😃
Not suggesting anyone should use Prolog.
That stands to reason (lame pun intended) because you can view Hindley-Milner style type inference as logical inference.
In fact, I have found it helpful to view Haskell typing (which is Hindley-Milner, but generalized with ad-hoc polymorphism and whatnot) as specifying a kind of Prolog program which the compiler runs first to produce (either a type error message or) the actual code which is finally compiled.
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.
Smalltalk took its image based development from Lisp and programmable semantics, and EMACS is kinda of a Lisp/image or Lisp machine. BTW programmable semantics like being able to change the meaning of cond, set, defun, let were sort of what the early definition of object oriented were (i.e: the semantics are objects in the code that can be changed).
What large systems did Bob build? He mentions large systems dozen times in this articles. I would like to know what he created.
he signed NDA :)
I would argue that the term "large systems" in itself vague and ambiguous. There are complex systems, and many, if not the most of the systems are more complex than they supposed to be. There are high load systems, but high load doesn't mean that the system is complex. So the right question should be "what complex by necessity systems did he build, not over engineered".
He calculated the first 25 square numbers, quite impressive!
I would also like to see Bobs code in a real world system and see how understandable his code is.
@@fredoverflow There is a shorter way to do it if he didn't use take and "infinite" range: (map #(* % %) (range 1 25))
22:00 Basically, imagine you create a new VM, install your tools on it and develop your application on it. Image is basically snapshot of that VM.
It's like saving your python interpreter session as an executable and shipping it out to your customers, haha.
That actually sounds nice
@@amrojjeh It is pretty nice. I'm currently learning Pharo, which is a type of Smalltalk, but it has some issues integrating in my environment. Also, if you're used to type systems, the optimal programming route seems mental, but it works if you can force yourself to forget everything you learned before.
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.
Great vid Prime. Have you covered Paul Graham's "Beating the Averages" yet?
High 20s fps, with many objects on the screen. That blew my mind.
Hasn't it been Uncle Bob telling nesting more than 3 levels is evil? ((((()))))
The nuttiest uncle Bob blog post is on the clean code way of doing switch statements. If it was anyone else I would have thought it was a joke
In his book he talks about not repeating the same switch statement all over the place and using polymorphism in stead. In Martin Fowler's refactoring book similar advice is given. I'm assuming this is not what you are referring to? As imho this advice still holds in many contexts...
I really like the argument you make 'what I think is good is really what I think is familiar', this is part of why I often use a bunch of random programming languages or technologies. When I was still a baby dev I fell into the trap you mentioned here for years, I mainly stuck with Python and didn't understand why people liked things like a type system.
Only after actually using things like TypeScript and Rust I finally started to understand and I became a better programmer because of it!
In your own mind perhaps.
Uncle Bob strikes me as desperately wanting to find the "one true language" that can be used for everything, so he can run to the UN, petition flapping in hand to try and legislate that all software written from that point on must be written in that "one true language" in the way that he deigns correct.
yea that's essentially what he said in one of his videos; he seems to want the government to mandate the tools we use, which is absolutely absurd, especially with a dynamically typed gc'ed slow language.
aforementioned video is entitled "the last programming language"
@@carlpittenger You can embed C/Rust into Clojure btw, you can also use a quasi-quote custom compiler macro thingy in a few lines to convert Clojure code into Rust code.
TBF, Go only Squashes the operands together with the operator when there's more than one thing happening. _fooBar := 1
my static code analyzer would probably force me to add parenthesis around 1
Something very prolog-like is probably doing unification in Rust's type checker
I really enjoy trying out different languages. I’ve gotten around to 20+ in the last year. For some reason, Clojure always feels very natural to me. I can’t explain why, it just works for me. Also, I really enjoy Rich Hickey’s take on things; it usually makes me think.
The only thing more life changing than a LISP for a programmer is Haskell I think.
And yeah - Rich Hickey has a great take on things.
Sadly, with him stepping down things might change...
I think it comes naturally because lisps are very consistent. There’s hardly any syntax that deviates from the familiar (fn a b c)
@@dmitriyobidin6049 I thought he’s off the nubank team but not actually off clojure..
@@mcspud Smalltalk + LISP + Haskell + AI agents
Get rekt y'all lisp haters. We knew from the start the power lisp and its dialects had.
"Any sufficiently complicated C or Fortran program contains an ad hoc, informally-specified, bug-ridden, slow implementation of half of Common Lisp."
14:32 Exactly the point the creator of Clojure makes in `Simple Made Easy`. I love clojure the language, even compared to a very similar language like elixir. But I cannot deny that the library system is too fragmented, there is no consensus, apart from if this is good or bad, it's very hard for beginners. That’s why I think clojure tends to be appealing for long time programmers. There is also Datomic, which is a very cool concept of a database.
11:20 And that's why you never put the { at the and of a line, but only as the first non whitespace char of the line. So you see when it's not there. (But it should be there anyway.)
I have built a webbserver in prolog, just because people said it could not be done
I started to write my pet projects in Clojure several months ago
Now, I am looking to switch to it fulltime 🤗
Nice. What language(s) are you switching from?
@@nandoflorestanlisp 😈
@@nandoflorestanfor me its js
@@nandoflorestan mainly from Java ))
Could you put the articles in the description? Like i get it i could probably just find it from the video, but it'd be nice to just have a direct link in case I want to check out the article/other stuff the guy has done. Thanks :)
Clojure has its issues (which language doesn't?), but in the grand scheme of things it is a rather beautiful/elegant/stable language, that will make you realise how little (if any) mutable state you actually need (amongst other things). You should definitely check it out - you will NOT regret it, especially given how much you dislike immutability...
As a CL-USER, mutable state is my favorite feature. When you enter a debug trap, you are given options to fiddle around with everything haha.
"not if you use a gun" took me so off guard I coughed lmfao
One thing he seems to forget is, how easy is it to read for other programmers. Your likely to read more code than writing it
Sure it can be nice to write fast, but it also needs to be maintainable.
Who cares about that ? Here I wrote this nice clean, succinct code which not even I will understand in one year but doesn't it look cool ? For people who need to understand this afterwards ... well it's their problem , right ?
I've seen numerous issues with this where you have a 2 line expression but why write some if and else when you can ? and then some = and some more == ....
14:22 Prime echoing the talk "Simple Made Easy", by Rich Hickey -- creator of Clojure.
20:57 “we’ve entered the era of ‘tweaking’” - Uncle_Bob 2023
Haskell has fewer symbols for the same effect
take 25 (map (^2) [1..])
Or if brackets annoy you for some reason:
take 25 $ map (^2) [1..]
If the whole argument is about readability, just do
map (^2) [1..25]
If I didn't use curly bracket in loop, I usually just write it beside the loop itself so I won't mistake it inside curly bracket when I want to add code. Not that I support it, I'm just lazy sometimes
1:10 Warren and others claiming that Prolog is great for writing compilers:
20:00 I think this is not always true as there are new academic concepts sometimes explored in new langauges and these usually trickle down eventually to more mainstream languages.
9:37 so many parenthesis...
Can we stop complaining about parenthesis? Because this would be the same in C or whatever:
println( take( 25, map( square, range())));
How many parens ? YES
The comment of good vs. familiar is so spot on.
When did Dr Disrespect get into programming?
Ok, i'm sure i'm not the first to make that joke.
I have to say, you are a programmer I can stand to watch. Very entertaining. Not cocky or dogmatic. Seem to be quite knowledgeable. Subscribed.
my man
"What I think is good may just be what I think is familiar"
Thanks a fkin great philosophical quote for many perspectives we have in life
If you're going to use Clojure you may as well take the extra step and try out Anglican.
5:00 It makes sense you need a _list_ of reasons to use lisp, the same way there is an _array_ of applications and OSs written in C and multiple innovative attack _vectors_ for any new C++ construct
"framerates in the high 20s"...
Oh man... Say what you will about Uncle Bob, but this article is absolutely hilarious, probably the best joke he's ever made.
Edit: Seeing some people in the comments taking him seriously, as if he is serious here, no this is very much trolling. I've seen the Casey video and a video on their email correspondence, but this article is a shitpost, you can't tell me otherwise.
I learned Common Lisp for my Machine Learning class in college a few years ago and was surprised at how suspiciously simple it was to do things with it, however fast or slow it may have been, compared to other languages I already knew at the time like C++ or even JavaScript and PHP at the time (2017). The final project was to implement a solver for the game "Mastermind" and we were graded based on the order in which our groups of three or four took the most rounds to timeout our solving algorithms as the number of colored pegs to guess increased. IIRC my group finished 5th or 6th in the class even with our fairly naive mostly brute force approach that kinda looked like baby's first bubblesort but Lisp.
Someone talking enthusiastically about Lisp is what brought me (back) into programming.
The "good == familiar" argument you made is the 'blub paradox' from Paul Graham's article. I was surprised you hadn't read his articles.
uncle bob must never be forgiven
I like Bobs comment on speed. I’m a huge fan of the lisp family of languages (since the early 80s). The high performance of Lisp comes in part from its limited syntax and semantics. It relies on fewer constructs, which have been made very robust and speedy. You do need to process more code is the trade off.
He made the performance of clojure sound absolutely awful though…
I'd love to see someone solve the small syntax static typing problem. The ML family gets close, but I would consider that to be a rather midsize syntax. With Lisps you can just throw macros at the problem, but when everything is just symbols and s-expressions it all blends together.
It's all bit soup in memory. The goal of static typing isn't to keep the square peg from fitting in the round hole. The point is more along the lines of slapping your two year old's hand when they try to put the square peg in the round hole. I don't know where I was going with this, I just have invasive thoughts.
*Programming will forever suck, that's all there is to it. It is just always going to suck, why are you trying to make it not suck?
Just accept the suck and determine which version of suck you want to suck on* - ThePrimeagen, 2023
This is actually crazy
🤣🤣🤣🤣🤣
EDIT: I swear the ending got me rolling, didgn't expect that.
Lisp is called the only language that is beautiful. Trying the unfamiliar can only make you stronger.
Bob saved the OOP world with his "Clean Code". Now he transitions to the functional programming camp where he will sell books and trainings on how to write "Clean Functional Code". After all he has done functional style programming in Assembler, Fortran, COBOL, Java, C, C++, SQL, Prolog, Python, C#, Smalltalk, Swift, JavaScript, Dart and Rust.over the last 40 years.
I like how Clojure is "The bestest language evar!" for people who used to code on Java.
In a Bizarro-world version Mark Seemann praises F# as the new gospel.
This parallel cracks me up for some reason.
I had to use lisp in college, really liked it. Map, reduce and such functions made sense to me once I tried lisp. It's just cool to have more experience on the functional side of programming :)
20:23 heck even the first Rust compilers were written in OCaml
programming in Clojure daily for the past decade almost and I've never been happier.
started with BASIC on ZX81, then Forth & Z80 assembly on ZX Spectrum, Pascal & x86 assembly on DOS Delphi on Windows, then awk, bash, grep, Microchip PIC assembly, 7 years of vim, GNU Forth on Linux, REBOL, Ruby, Node, Solidity and "finally" Clojure with IntelliJ+Cursive (with some Emacs/CIDER keybindings), which is the most convenient bloatware of our times overall.
The prophecy of Brian is turning out to be really true, because you know it is Uncle Bob of Clean Code™ liking a language from a programming paradigm that by its very nature despise the rules of clean code.
What?! Uncle Bob loved Smalltalk then moved to Clojure. Smalltalk's version of OOP is very very different from Java/C++/C# ManagerFactory class inheritance BS. In Java doing OOP meant doing "cargo cult" programming having your control flow be split apart, using mutable state, having lots of code, etc... Smalltalk had 1st class functions, 1st class conditionals, metaclasses, actual message passing, Alan Kay always bragged that he could build programs in 5-10x fewer lines of code than in Java in Smalltalk.
I had a Prolog class back in college and I thought it was great. Loled hard at the ad-hoc invention of a typical Prolog exercise, though
If T-800 ran on Prolog, he would kill John Connor and then say:
Yes
@@bennymountain1 Funny thing is, with some minor modification Prolog-T-800 could _also_ produce new John Connors.
10:28 As The Notorious B.I.G. once said, “give them operators room to breathe.”
Take a look at his article named "NO DB"
One thing to add to the editors part is that using an editor that has some form of structural editing either built-in or as a package is a gigantic advantage when writing Lisp.
see for example Vim plugins guns/vim-sexp and tpope/vim-sexp-mappings-for-regular-people
parinfer-rust ftw
For IDE support, if you like VS Code, there is Calva. (Yes, I'm biased.) And for those who like to hack their editor in user land like you can with Emacs, there is Joyride doing the same thing for VS Code. By some strange coincidence the language used by Joyride to hack VS Code is Clojure. =)
I'm regularly using the Calva standalone REPL to test out ideas.
And for neovim users, there’s conjure
11:20 rant ....i think its neat feature, if you have simple condition much like && in bash ...you simply put it right next to it. Everyone reading it should instanlty understand that this doesnt branch the program, its more like "do this one this if condition matches". I never used it with loop tho ...but its very popular syntax and if someone doesnt understand it i think this isnt your fault for writing it. They should know it. Its clean syntax where instead of writing 3 lines you write it all in one line (or 2 if its very long, which is rare in my experience). And if need arises where more statements belong in this, it suddenly becomes "branch of program" where you put curlies around. It makes it easier to read and if noobies dont get it that isnt something you should be concerned about in the first place. They should learn and this will be just one little small thing in their giant list of "things to learn"
I have no idea why it happens. But every single time Prime says, "pound me daddy" and "CLO-JUR" I laugh. I thought it would stop being funny but it doesn't. I'm watching this on loop for 2 days and laughing. I think i need help.
The Finnish company Metosin created a spec alternative called Malli. Its pretty fun to use once you get used to it and I prefer it over spec tbh. For the nested functions-lists, all those parentheses, you can use the threading macros to help you out, stuff like thread first -> and thread last ->> . I cant live without my Clojure REPL hahaha . Stockholm Syndrome Language indeed... haha
Nice to see some Clojure content. Would also be great so see reactions on one of Rich Hickey's talks.
11:55 I thought it was fine because you can put both the loop and the function call or whatever on one line
So that disaster doesn't happen
"DOZENS OF 'EM" just murdered me for some reason wtf 😹
cmon prime, try a little haskell prime, i promise it won’t do any harm prime… there’s nothing to be afraid of prime…
The cat joke at the end... oh man, what a great video
BTW what's wrong with Lisp, why choose Clojure?
probably java interop since native java is very usef
Bob's wrong: PostScript was not based on Forth. Both drew inspiration from the same source: Burroughs Large Systems architecture.
If you don't know what image in Lisp languages is, maybe you should look it up before continuing rambling on. Yes, Smalltalk had it too. Go look it up.
19:50 (language composition) composition
If a small syntax is good then how good is whitespace with its 3 characters
To be fair back in the 80s and 90s compilers would generate different code when you didn't use { or if you did. So programmers were encouraged to not use them.
"println (take 25 (map pound me daddy" -ThePrimeagen
What’s your take on APL.
15:40 if you do math a lot, you will have functions within functions within functions within functions. It's normal. Talking about parentheses is quite parenthetical to the main subject.
Used scheme for a semester. Hell will freeze over before I'll touch this dumbsterfire ever again.
If there's one thing I hate typing, it's brackets. Isn't there something like $ in Haskell, but in Clojure?
There are threading macros (->> and -> among others) that act like a pipe operator so you can avoid too much nesting
is there some kind of compiled lisp?
"It requires fewer mental gymnastics".
First example: lots of mental gymnastics...
"map (^2) [0..24]"
- Haskell
I'm just a hack hobbyist who uses programming as my version of crossword puzzles to keep my old addled brain spry.
But in my novice experience watching the pantheon of programming gods arguing like Beverly Hills Housewives, my piddly conclusion is that programming is not much different from politics. We all assume the greater good is the ends, but we'll gladly kill each other during the means.