

original snes super mario world is still a blast, tetris is another game that’s still fun


Seconded, I should’ve just said Racket really.


It’s very frustrating to be in a situation where you know how to do something one way, but you can’t do it like that and you have to learn a completely different way to do it. Feeling like a beginner again makes people feel stupid, and most people don’t like that. But it really just means you’re learning a new way to approach problems.


While they’re far from mainstream, they’re definitely languages worth learning. And I’d argue that learning functional style first gives you a much better intuition regarding state management which makes you a better imperative programmer as a result. It’s much easier to go from functional to imperative than the other way around.
I mostly work with Clojure myself, and it’s pretty easy to set up with VSCode and Calva plugin. There’s also a lightweight runtime for it that doesn’t require the JVM which is great for a learning set up. You just run bb --nrepl-server and then connect the editor to it as shown here. From there on you can run code and see results right in the editor. This is a good overview of what the workflow looks like in practice.
Also have some beginner resources I’ve used to train new hires on Clojure.


I would suggest taking a look at Scheme or Clojure for somebody who has no development experience. The big reasons being that these are high level languages so you can focus on learning the actual concepts without all the incidental complexity of imperative languages. Scheme in particular was designed as a teaching language. The other aspect is interactivity, Lisps have a tight integration between the editor and the REPL and you can evaluate functions as you write them. This is incredibly helpful for learning as you can write a function, send it for evaluation, and see the result immediately. So you can play with code and get an intuition for how things work.


you mean the Gestapo since GDR was integrated into the west German model
That’s my view as well. There ultimately needs to be a human decision maker in the loop for any meaningful work to happen.
that’s the joke :)
And then they’d need to be able to verify that the code actually meets these requirements. That might even necessitate specifying these requirements in some sort of a formal language…


We cannot understand class behavior by examining individual morality. Viewing the capital owning class as a collection of mustache twirling villains is not a useful framing. Rather, we should look at them as the human personification of capital itself. Their social being, their entire material condition, is defined by the accumulation of private profit and the protection of property relations that enforce their dominance.
Their inability to relate is not a personal failing but a direct result of their objective position in the capitalist mode of production. They live in a world insulated from the precarity of rent, medical debt, and wage slavery that defines life for the working majority. Their consciousness is shaped by them being insulated from the problems regular people experience. Therefore, critique of their lack of empathy is a liberal dead end because it mistakes a systemic outcome for a personal choice.
The focus must be the capitalist system itself, which necessarily produces the inequality and the divide between the capitalists and the workers. The fundamental contradiction between the socialized nature of production and the private appropriation of wealth is the core issue. The solution is to dismantle the economic base that creates them as a class and move towards a system where the means of production are socially owned, abolishing the very material conditions that breed alienation and disparity.


exactly, a great tv series on the subject incidentally https://www.imdb.com/title/tt0078588/
My point is that the problem is systemic, and all corporations end up leaning towards similar practices in the end because that’s what the selection pressures under capitalism drive them to.
If you’re using a modern computer then you’re buying it from one of the handful megacorps around. Apple isn’t really special in this regard.
does that run on Asahi though, I couldn’t figure out how to
Erlang isn’t special because it’s functional, but rather it’s functional because that was the only way to make its specific architecture work. Joe Armstrong and his team at Ericsson set out to build a system with nine nines of reliability. They quickly realized that to have a system that never goes down, you need to be able to let parts of it crash and restart without taking down the rest. That requirement for total isolation forced their hand on the architecture, which in turn dictated the language features.
The specialness is entirely in the BEAM VM itself, which acts less like a language runtime like the JVM or CLR, and more like a mini operating system. In almost every other environment, threads share a giant heap of memory. If one thread corrupts that memory, the whole ship sinks. In Erlang, every single virtual process has its own tiny, private heap. This is the killer architectural feature that makes Erlang special. Because nothing is shared, the VM can garbage collect a single process without stopping the world, and if a process crashes, it takes its private memory with it, leaving the rest of the system untouched.
The functional programming aspect is just the necessary glue to make a shared nothing architecture usable. If you had mutable state scattered everywhere, you couldn’t trivially restart a process to a known good state. So, they stripped out mutation to enforce isolation. The result is that Erlang creates a distributed system inside a single chip. It treats two processes running on the same core with the same level of mistrust and isolation as two servers running on opposite sides of the Atlantic.
Learning functional style can be a bit of a brain teaser, and I would highly recommend it. Once you learn to think in this style it will help you write imperative code as well because you’re going to have a whole new perspective on state management.
And yeah there are functional languages that don’t rely on using a VM, Carp is a good example https://github.com/carp-lang/Carp
RISCV would be a huge step forward, and there are projects like this one working on making a high performance architecture using it. But I’d argue that we should really be rethinking the way we do programming as well.
The problem goes deeper than just the translation layer because modern chips are still contorting themselves to maintain a fiction for a legacy architecture. We are basically burning silicon and electricity to pretend that modern hardware acts like a PDP-11 from the 1970s because that is what C expects. C assumes a serial abstract machine where one thing happens after another in a flat memory space, but real hardware hasn’t worked that way in decades. To bridge that gap, modern processors have to implement insane amounts of instruction level parallelism just to keep the execution units busy.
This obsession with pretending to be a simple serial machine also causes security nightmares like Meltdown and Spectre. When the processor speculates past an access check and guesses wrong, it throws the work away, but that discarded work leaves side effects in the cache that attackers can measure. It’s a massive security liability introduced solely to let programmers believe they are writing low level code when they are actually writing for a legacy abstraction. on top of that, you have things like the register rename engine, which is a huge consumer of power and die area, running constantly to manage dependencies in scalar code. If we could actually code for the hardware, like how GPUs handle explicit threading, we wouldn’t need all this dark silicon wasting power on renaming and speculation just to extract speed from a language that refuses to acknowledge how modern computers actually work. This is a fantastic read on the whole thing https://spawn-queue.acm.org/doi/10.1145/3212477.3212479
We can look at Erlang OTP for an example of a language platform looks like when it stops lying about hardware and actually embraces how modern chips work. Erlang was designed from the ground up for massive concurrency and fault tolerance. In C, creating a thread is an expensive OS-level operation, and managing shared memory between them is a nightmare that requires complex locking using mutexes and forces the CPU to work overtime maintaining cache coherency.
Meanwhile, in the Erlang world, you don’t have threads sharing memory. Instead, you have lightweight processes, that use something like 300 words of memory, that share nothing and only communicate by sending messages. Because the data is immutable and isolated, the CPU doesn’t have to waste cycles worrying about one core overwriting what another core is reading. You don’t need complex hardware logic to guess what happens next because the parallelism is explicit in the code, not hidden. The Erlang VM basically spins up a scheduler on each physical core and just churns through these millions of tiny processes. It feeds the hardware independent, parallel chunks of work without the illusion of serial execution which is exactly what it wants. So, if you designed a whole stack from hardware to software around this idea, you could get a far better overall architecture.
it’s all ARM now, there’s software x86 emulation on macos. I guess you could run x86 vm on Linux, but not sure how fast that will be.
The main problem is you’re pretty limited with software since you can only run stuff that’s been compiled against it.
yeah it’s a really powerful editor that can handle tasks you’d normally use a few different apps for