> I've yet to see a set of first principles from which Nim has been designed, > if indeed it was originally designed from "first principles".
"First principles": Memory is a set of "locations" of different sizes, ideally a value of a type is of a fixed size, in order to improve type checking you can have a `distinct` type of a fixed size, in order not to break composability you want to avoid arbitrary restrictions so `distinct T` should be available for any `T`... You get the idea. It's easier to show examples where clearly things were not done from "first principles": * Arrays decay into pointers because we only want to pass pointers as parameters for efficiency. (C) * Arrays are covariant in Java because we lack generics and want `Array.sort` to work for any array. (Java) * Local declarations are done without keywords but for others we have `global` and `nonlocal`. (Python) * For efficiency we special cased "array of float" in our type system. (Ocaml)