A robust static type system is what was missing for me, at least last time I looked.

Static typing and messaging (OOP) don’t exactly fit together. If you want OOP, you are fundamentally beholden to dynamic typing.

I don’t want OOP. I just want the language to include a system for imposing constraints that prevent entire categories of bugs and make it easier to safely do large scale refactoring.

It’s really hard to go back to living without this once you’re used to it.

Coq, Idris, et. al. are over there if that's what you really want, but there is probably good reason why no "real world" programs are written in languages with proper type systems.

For one, there's little ability to avoid message passing in our modern world. You can take it out of the language, but that just means pushing it to another abstraction (e.g. sockets), and all the same lack of type safety comes right back.

[deleted]