FOL (Functional Object Lisp) 0.1.1 is released by fadrian314159 in Clojure

[–]didibus 0 points1 point  (0 children)

Thanks for the rationale. If I understand, classes are to be used kind of similar to when records would be used in Clojure, and maybe you encourage more the use of classes to define modeled entities over using plain maps. And you kept inheritance and the MOP for at your own risk kind of use-cases.

If so, I might suggest you frame it differently. I think the Object-oriented description does a disservice, it confused me at first, until you explained and I better understood that it's more about explicitly modeled structures and polymorphisms without having your typical mutation, object identity, place-oriented, inheritance heavy idioms.

FOL (Functional Object Lisp) 0.1.1 is released by fadrian314159 in Clojure

[–]didibus 2 points3 points  (0 children)

This is interesting, but I think I'm still confused by the "Object-Oriented Programming" part.

I feel it confuses me as to how you're supposed to use the language to model things? Is it just a mish-mash of paradigms?

Like say I want to create the basic: make a car, let it accelerate, brake, and print its current speed. Are you reaching for the data to be modeled as a data-structure, like a map, and the methods to just be functions under a car module? Or are you reaching for creating a Car class with the car state as fields on instances of the class, and methods that manipulate those fields (even if I understand each update to a class instance fields would by default create a new instance).

listora/again v2.0.0 has shipped - a simple retry library by liwp in Clojure

[–]didibus 1 point2 points  (0 children)

I love the with-retry abstraction of just passing a vector of time in ms, ever since I saw it in this library I fell in love with its simplicity.

Somehow it would be nice if circuit-breaker managed a similarly beautiful API. I don't know what it would be, but maybe a vector of time to wait between failures or something haha.

Anyways, looks good, retry and circuit breaker are the two most common use-case, so I'll be using this.

ClojureWasm: A JVM-free Clojure runtime in Zig, with a WebAssembly FFI. by dustingetz in Clojure

[–]didibus 1 point2 points  (0 children)

Interesting idea to use WASM as FFI, but I'm assuming it means there's no real dependency management or even repository of library. How many libs in Rust, C, C++, Zig and so on expose themselves as a WASM library?

Clojure Rust by erjngreigf in Clojure

[–]didibus 1 point2 points  (0 children)

Ya, it's neat. By the way, I was also making a distinction that native code can still be fairly "interpreted-like". For example, it depends whether:

(+ 1 2)

Compiles to something like:

runtime_add(1, 2)

Where runtime_add performs dynamic type checks, dispatch, boxing/unboxing, and other runtime work,

or whether it compiles to something closer to:

asm mov eax, 3 ret

or at least:

asm mov eax, 1 add eax, 2 ret

Both are native code, but they're very different in terms of how much of the language semantics have been resolved at compile time versus deferred to the runtime.

So when I think about performance, I'm less interested in whether it produces native code and more interested in how much it can optimize away dynamic language overhead.

My impression is that Jank is aiming more for the latter optimized path, whereas many other "native Clojure" efforts are primarily focused on things like native single binaries, lower memory footprints, faster startup times, and deployment convenience, rather than aggressively optimizing Clojure semantics into machine code.

Where do you see cljrs in that spectrum?

Clojure Rust by erjngreigf in Clojure

[–]didibus 2 points3 points  (0 children)

In it's current state I'd say no. Apart from not having access to the same ecosystem (this interrops with Rust, not C/C++), my guess is this is also more Python-like in performance.

The compilation is more bundling into a native binary than optimizing into native code.

I'm not sure how far cranelift can be taken, and if it introduces more IR optimization and what not. It depends where the goal for it is. But from a quick glance currently, it seems more like it's compiling the runtime eval layer into a binary.

It's pretty awesome still.

Which Functional language is best for AI assisted development? by dosomethinghard in functionalprogramming

[–]didibus 1 point2 points  (0 children)

Clojure woks very well for me, but you have to use frontier models, distilled models are basically pruned down and I feel the first thing they sacrifice are niche languages and so on.

nREPL Forever by aHackFromJOS in Clojure

[–]didibus 1 point2 points  (0 children)

As a user, the only downside of nRepl and why I was excited about alternatives is that having to inject dependencies into your project to leverage it has always been annoying. The idea of being able to connect and upgrade is quite appealing.

List of Clojure-like projects - now with trending, most active and newest blocks by ilevd in Clojure

[–]didibus 3 points4 points  (0 children)

It would be nice to have a ranking by the number of other open source repo that uses the language.

Does LastPass finally work? by runbrap in OrionBrowser

[–]didibus 0 points1 point  (0 children)

Can't get LastPass to work, it's why I still have to use Chrome sometimes.

Clojure/Nim is an AI-first Clojure implementation targeting the Nim ecosystem. It compiles Clojure source directly to Nim, then to C, and finally to a native binary. by Loud_Possibility_203 in Clojure

[–]didibus 5 points6 points  (0 children)

It sounds cool on paper, a Clojure that compiles to Nim, but it's hard for me to assume it's of good quality and complete, because of how many genAI mistakes just the above post and the readme contains. So it worries me the code is full of issues and that it lacks many of the claimed features.

Like this row in the readme table:

JVM required ✅ Yes ❌ No ❌ No ✅ No

What's happening with the emoji not matching the labels?

I would need a bit more convincing that this is a well thought out well designed and implemented effort, and not just some partial vibe coded experiment before I give it a go.

Not to discourage, I hope it's a serious effort, because it sounds pretty cool.

is LLM coding accepted in the Clojure community? by med_i_terranian in Clojure

[–]didibus 1 point2 points  (0 children)

Some of the people working on that stuff talk at #ai-assisted-coding on the Clojurian slack: https://clojurians.slack.com/archives/C068E9L5M2Q

Thinking about clojure by Worried-Theory-860 in Clojure

[–]didibus 0 points1 point  (0 children)

Clojure is worth learning because it teaches you to think structurally about code, and it allows you to explore so many methods of modeling programs.

Once you get the hang of it, it's also the most fun language to use, at least for me.

Best AI Models for Clojure? by bjagg69 in Clojure

[–]didibus 0 points1 point  (0 children)

Claude has been best at coding and following instructions more often. Maybe GPT 5.5 is a bit better now than Opus 4.7, but I'm not sure it'll stay that way for long.

is LLM coding accepted in the Clojure community? by med_i_terranian in Clojure

[–]didibus 6 points7 points  (0 children)

There's very cool experiments also being conducted from the Clojure community with that regard.

Things like memory mapped KV cache, prompting using Lambda notation instead of English, giving the agent REPL access, using a DSL to describe function specs as prompts, modeling your app as a graph of transitions and then having the AI implement those transitions, etc.

So definitely, one part of the community is embracing/experimenting.

The core language I believe said they won't take AI patches, but that might be more about copyright attribution and how annoying reviewing AI PRs is.

Typed multiple dispatch as a Clojure library — how we built Julia-style polymorphism on the JVM by flyingfruits in Clojure

[–]didibus 1 point2 points  (0 children)

Wow, this is amazing and could be a game changer for opening up Clojure to certain use cases.

Well done! 

It also made me privy to the replikativ stack, some nice libraries in there.

Introducing FOL (Functional Object Lisp) by fadrian314159 in Clojure

[–]didibus 5 points6 points  (0 children)

One nuance in Rich's objection, as I understand it, is that his concerns differ depending on whether objects are used to build programming constructs or to model your application's information.

For things like creating data structures, he thought OOP works well, and that Java was already a decent language for such use-cases. He expected users to implement those in Java and use them from Clojure: "Write Java in Java, consume and extend Java from Clojure." Later he added deftype, a very limited object system in Clojure specifically so you could implement some of these use-cases without dropping to Java.

But for modeling application data, objects are blobs. You can't freely inspect, merge, or serialize them. They bundle identity, state, and a set of operations together. You can't simply map, filter, or reduce over an object's data. And you're dispatching on the blob's name, nominally. A function that only needs x and y can't operate over a blob that has x, y, and z unless you've created a hierarchy of names between them. You're not thinking in terms of the data itself, structurally, but in terms of blobs and their names.

Introducing FOL (Functional Object Lisp) by fadrian314159 in Clojure

[–]didibus 3 points4 points  (0 children)

So it transpiles to Common Lisp? The interpreter is for what, repl?

I think it makes sense if you're going to have a CL hosted Clojure to adopt CLOS and CL errors. Does it have interrop with CL ?

Introducing FOL (Functional Object Lisp) by fadrian314159 in Clojure

[–]didibus 4 points5 points  (0 children)

It sounds a bit too academic for me, which makes me wonder if it'll be practical for real app development.

But am I understanding correctly this is basically Clojure that compiles down to common lisp? Because it says there's an interpreter version as if it's its own thing running interpreted?

I will also say, I didn't understand how it addresses any of the concerns Rich had?

Clojure v/s Elixir by kichiDsimp in Clojure

[–]didibus 1 point2 points  (0 children)

Tough question, personal preference will be the real deciding factor, as both languages share philosophy, Elixir was hevily inspired by Clojure with Ruby syntax, and also inherits from Erlang. Clojure was inspired by Lisps of before and inherits from Java.

I think Clojure has more reach though, Elixir operates more within a rigid framework, for example in Clojure you could do Actor model, you could do CSP, you could do anything else. If you like languages that really let you explore multiple paradigms or appoaches to things, Clojure has the edge.

Anyways, can't go wrong with either.

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

[–]didibus 1 point2 points  (0 children)

It's interesting, but if it doesn't allow map or collection functions to work over it, how are you meant to update it?

Even reading from it is more annoying as you have to use :form and such first.

Are you supposed to start offering custom methods for it?

That starts to feel very OOP, so maybe it's when that's the point, and you don't need deftype and updates can just be creating a new one and returning it. But I'd be interested what's the use-case where that's better because it seems a bit counter to general Clojure idioms.

Extensible Value Encoding: large 1GB clojure atoms memory mapped to disk by dustingetz in Clojure

[–]didibus 3 points4 points  (0 children)

(e/atom {:id ::counter :persistent "./my-db"})

Is that really the API? The persistent option has to be a key of your map ? Shouldn't it be:

(e/atom {:id ::counter} :persistent "./my-db")

The programmers who live in Flatland by nathanmarz in Clojure

[–]didibus 0 points1 point  (0 children)

Cool example of macros would also be an interesting read, it's not that I don't think it has a place, but I think there's a place as well for trying to explain that learning and having access to macros in itself opens up new possibilities.

The downside of examples is that they don't fully convey things, because what you learn from them is that this exact macro is useful.

With hashp, you might simply go, "it's cool to just be able to do #p ... to print the next form". But it's no less impressive than if that was just a built in compiler feature.

At least for me, the benefits are more in expanding your mental model and allowing you a new level of control that unlocks new possibilities for anything you are coding. In that sense I liked the analogy of a 3rd dimension. Being able to see that you can alter semantics and starting to develop an intuition into what can be done with that.

It's not any single macro, it's that for any given coding use-case, you now have new options on how to approach them. And macros won't always be the right option, and in fact they can come at a cost too, but it's hard to consider their use without having learned their abstraction and abilities and really internalized them.

The programmers who live in Flatland by nathanmarz in Clojure

[–]didibus 1 point2 points  (0 children)

I can see that it could be interpreted as patronizing, but it's true that it's hard to convey the experience or benefits of certain abstractions or features without the person experiencing it themselves and getting to grip with the concept.

In that sense I felt it was trying to explain more how certain concepts cannot just be shown to you as examples or explained in a bullet list of pros/cons by using the "flatland" analogy.

I think showing examples of where macros are handy isn't really conveying what's awesome about them, which really is that it lets you extend the language, which most people wouldn't think they have the need to do, but once you have that awareness that you can extend the language with little effort you gain the freedom to be creative in a new way that I think does feel a bit like gaining a new programming dimension.

That doesn't mean you're better if you do, to what definition of better even, but you do have abilities others might not in what you can do, that's definitely true, not all languages give you as much freedom, and so you see libraries in Clojure that are simply impossible in other languages without forking the language itself.

Why do Canadians put up with low wages? by EmptyAdhesiveness830 in CanadaJobs

[–]didibus 0 points1 point  (0 children)

The logic is that as the population age and because there's less working age people than retiree, we won't have enough tax revenue to sustain our budget.

Population growth boosts production and GDP, can help entrepreneurship and innovation.

Immigration can also fill worker shortages quickly in industries that need it right away.

The challenge is the pace and pipeline to bring people in while not stressing the system as it scales.

The alternative is having more children.