I would recommend taking a look at Julia. What it can't do is "get nullability right at compile time" however you can define Integer values which can't be zero and have that changed at run time with more and more of these checks moving to compile time but still raising errors at run time, "force you to look at values" but you can throw arbitrary stuff which is nice. Julia has the rest you wish for though. Julia has nice macros, has multiple dispatch instead of inheritance, a vibrant and growing community. It is mostly used in numerical work however use it on other domains has also shown a lot of promise, at the moment producing standalone binaries is still complicated, it pays compile time every time a function is called with new types.
No comments yet.