I tried to write some things down more axiomatically, with some propositions that folks could agree or disagree on, which might get more to the heart of the matter than discussing possible conclusions. I didn’t do very well.
I’ve put a few down that I support, but they are debatable. In particular, they range farther afield than “memory safe, low level”.
P1. code shouldn’t have [much] different semantics on different platforms.
I am much happier with code not compiling rather than compiling into a program that may unexpectedly produce different results. This is imo an important part of a healthy library ecosystem. I see this as a strike against Designs 2 and 3.
P2. people shouldn’t use unknown integer widths for performance.
They can certainly use known, and varying, integer widths for performance, but you should opt in to this. Random day one Rust user isn’t going to get excited because Rust uses one versus another; serious Rust user doesn’t want to guess whether uint means register sized or memory index sized or whatever. I see this as a strike against Design 3 and for Design 1 (where maybe you have imem, umem, ireg, ureg, and whatever other meaningful systems-level types should be).
P2a. people shouldn’t use unknown integer widths.
This probably isn’t defensible for ergonomic reasons, but it’s good to think of the legitimate reasons to use unknown widths in core logic, other than convenience.
P3. explicitness is an important part of Rust.
The reason I got excited about Rust was not that I could type for loops with as few characters as possible. There are better languages for that. It is because I needed to think about things that might not be problems (data races in my single threaded code?), but that by understanding made me better (ah, iterator invalidation!). Making the “hello world” experience easy is not a great motivation for having an int type, imo (improving ergonomics, might be). The “guidance” I think you should give is “you should have to think about integer widths, at least once”. This is again in support of Design 1.
My personal preference is Design 1, where it is non-trivial to put isize or usize or whatever in a data structure, but they come back from things like len(). If you want to use them, hooray, but you are acknowledging that your program may do different things on different platforms.
I’d also be happy with Design 4, as long as it is basically the same as Design 1 otherwise, and at some point new users get told “hey, int isn’t as lean as you thought it was”. I worry this may turn off folks who feel deceived, unless it is mostly fast, in which case (like other fancy language features) they realize “hey, robust code isn’t so bad”.
