A Reply to “Let’s stop copying C”
Most of what the author suggests is available in (modern) C++ - while maintaining backwards compatibility with C code:<p>* <i>Textual inclusion</i>: C++20 has modules, where you include sematically, not textually.<p>* Bitwise operator precedence: Not soundly supported, but you can sort-of have custom infix operators in C++, see:
<a href="https:&#x2F;&#x2F;stackoverflow.com&#x2F;questions&#x2F;15632217&#x2F;defining-new-infix-operators" rel="nofollow">https:&#x2F;&#x2F;stackoverflow.com&#x2F;questions&#x2F;15632217&#x2F;defining-new-in...</a>
so, specifically, one could implement the alternative modulo.<p>* Leading zero for octal: C++ has custom literals, so you could define a _octal or _hex etc and get the value determined at compile-time.<p>* No power operator: Same thing in Odin and C and C++, IIANM.<p>* Switch with default fallthrough: Since C++17, there&#x27;s an official [[fallthrough]] anottation. You can make your compiler fail in cases when you implicitly fallthrough. So, not as elegant, but you can ensure you don&#x27;t mess up and get the wrong behavior.<p>* (Type syntax: Nope, C++ has the contrived syntax of C.)<p>* Weak typing: With a library, you can have strong aliases which are not interchangeable with the aliased type. See this blog post: 
<a href="https:&#x2F;&#x2F;foonathan.net&#x2F;2016&#x2F;10&#x2F;strong-typedefs&#x2F;" rel="nofollow">https:&#x2F;&#x2F;foonathan.net&#x2F;2016&#x2F;10&#x2F;strong-typedefs&#x2F;</a>
and the library it links to. Things would be better, though, if the C++ standard committee allowed for an operator.<p>* Bytestrings: This is a library issue really. And both C and C++ have libraries which deal with wider characters, with UTF-8 and what-not.<p>* ++ and -- : You don&#x27;t _have_ to use them... and it&#x27;s possible to have static tools which forbid them in source files.<p>* ! Operator: C++ has !, &amp;&amp; and || , but also &quot;not&quot;, &quot;and&quot; and &quot;or&quot;. I like the latter.<p>* Multiple returns: It&#x27;s easy to return a tuple in C++, and with C++17 you can even construct and initialize multiple variables like that, e.g. `auto [index, name] = get_index_and_name(whatever)`.<p>* Errors: C++ is multi-paradigmatic here, supporting the traditional status return, an expected&lt;T&gt; type (either an actual T or an error; not yet standardized by available via widely-used ibrary), and exceptions. Monadic-style programming is not yet supported and will likely not be in C++20, but there are discussions about this.<p>* Nulls: With `std::optional` and `gsl::non_null`, and especially with no return types necessary, you can comfortably avoid using `nullptr` in C++ code.<p>So - with some choices and a little discipline (really not much!), you can have all of this &quot;Odinish&quot; behavior you like.<p>Of course - the price of C backwards compatibility and supporting multiple programming paradigms is complexity of the formal language definition, grammatic ambiguity, and a syntax that is not always pleasant.