Rust’s borrow-checker lets you write code with the both safety guarantees of immutability and the practicality of mutability. But it has its own drawbacks, most notably it’s hard-to-understand and makes certain code inexpressible (without using unsafe).

This article describes another borrow-checking type system which has the shared XOR mutable guarantee that gives “best of both worlds” mutability/immutability, but is more expressive and (arguably) easier to understand. In summary, instead of annotating borrows with “lifetimes” (how long they exist), they are annotated with origins (sets of places the borrow may have been created + mutabilities). Rust’s polonius borrow checker uses origins internally, but only to check and infer lifetimes; perhaps explicit origin-borrows could be added in addition to lifetime-borrows, except this would make Rust even more complex and difficult for newcomers.

Another “aliased XOR mutable” type system is Mutable Value Semantics, which is in the language Hylo (formerly Val).