> 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)


Reply via email to