Almost all Java ORMs are dynamically typed in the ways that matter. The "clunky codegen" method would be something like JOOQ, that actually checks your schema.
I agree that we cannot make broad claims or assumptions about early hominin culture. However, some of these claims about the history of slavery are either incomplete or false.
1. The image of the enslaved Greek language tutor gives a misleading picture of ancient slavery. It's true Greeks and Romans seem to have divided their social world on language and religion rather than skin color. But the massive numbers of Carthaginians and Gauls worked to death in copper mines were almost certainly not seen as equals by their enslavers.
2. I may be misreading you here, but the claim that "it was the push for equality and human rights that made African slavery so toxic" is reversing cause and effect. Racial plantation slavery in the Canary Islands predated modern movements for universal human rights. It was slavery that made human rights a European-only idea, not human rights movements that made colonial slavery a racial institution.
Correction: In a functional language (specifically Haskell):
x = 3 means: x is defined as 3.
x == 3 means: Is x equal to 3?
let x = 3 in [...] means: within the scope of [...], x is defined as 3.
There is no specific point where something is "put into the box" or "taken out of the box". In fact, there is no "box". The functional programming concept of "bindings" does not correspond to the imperative concept of "variables", not even the oxymoron known was "constant variables". (If you want variables in Haskell you need IORef or STRef, where the load and store operations are explicit monadic actions.)