1,491 karma · joined March 15, 2023
Goose is a straightjacket by comparison. I've never enjoyed languages that plant a flag on one mechanism and force users to adapt.
Also, exploring minified Godot template compilation led to me distributing a 24 MB portable package (10MB zipped). Astonishingly efficient.
Much as computers have made creation in other industries much easier, we're likely to see a glut of crap software made by non-programmers that does not meet any quality bar because these are the sorts who think "lines of code" was the hurdle to overcome.
It might suffice to say: The myth of sophisticated indigenous ecosystem engineers who harmonize with nature is a European trope.
Whenever any culture larger and more settled than hunter-gatherers has traditions of forest management and ecosystem balance, don't immediately attribute to them magical wisdom that Europeans somehow lack. Consider that those traditions are an ancient memory of one or more catastrophic ecosystem collapses and the practices of the people who survived them.
On a much more recent timescale, one of the dominant theories of the emergence of civilization places the ancestors of the Sumerians in a stupendously fertile valley at the bottom of what is now the Persian Gulf, eventually flooded during the retreat of the glacial maximum and covered in Tigris & Euphrates sediment. It could be the very origin of regional flood and primordial garden myths. But it's all buried.
If I'm remembering correctly, this is also why the energy required to "reach" the speed of light for subjects with mass parabolically goes to infinity. I'm also guessing it can directly trace a proof down to why kinetic energy increases quadratically.
Nim became the obvious choice, and I wasn't a fanboy before. Simple semantics, in a very functional style oriented around data's value. References and identity have to be trapdoored. Everything is single-owner unique lifetimes by default, no annotations or best-practices required. You end up writing extraordinarily functional/procedural code that produces very fast and memory-safe binaries, it fits right into C++'s niche.
The only objection I could steel man was that the standard library and most packages are composed of relatively pure functions that return new values, so allocations are happening there. But when types as complex as data frames can be semantically used as just values, and you know they have scoped lifetimes by default, the benefits are obvious.
With all of C++'s insanely specific, subtle, implicit, compiler- and platform-dependent behaviors, I've often wondered when the industry will finally consider its dominance an artifact of first-mover inertia and simply move on. There are vastly better ways to do all of the things it does, while easily exposing levers for the the things it's considered to do exceptionally well.
It also turns out that the mix is due to the standard library leaning on raw C loop iterations underneath whenever it can. Which is great! But it confuses the library's interface paradigms.
Buy or make a cube with a very normal distribution of cards, nothing crazy (I bought a cube made by Card Kingdom some time ago). There will be 90 spells per each of 4 players. Shuffle the whole deck, and deal out the 90 per player. Now you simply make 40 card decks, typically with ~25 spells each. There will be lots of wiggle room for sideboards or even side decks. Then run a little tournament.
The games are usually that ideal Magic scenario: Nail-biting back and forth gameplay, where anything powerful has a cost and games come down to the wire.