On Tuesday, 16 February 2016 at 13:35:56 UTC, Dicebot wrote:
On 02/16/2016 02:49 PM, Marc Schütz wrote:
`@mutable` OTOH would be a useful for both C++, reference counting, caching, lazy initialization... But we need to find a way to keep most of the existing guarantees, especially concerning shareability.

In my opinion @mutable would be a disaster of much higher destructive impact than head const. I am very opposed to it no matter how it is designed. Once you start considering it, you are better at simply throwing away existing const system and starting it all from scratch with D3. Logical const is harmful as it doesn't give and serious guarantees but gives developer a false sense of confidence.

The last sentence in my post is crucial: "keep most of the existing guarantees". If we can ensure that access to @mutable data is strongly restricted and properly encapsulated, we don't lose anything. The type system would stay as it is, there would just be a way for it to be broken locally without provoking undefined behaviour.

For example, it's always possible to use a global mutable associative array to store additional data connected with an immutable or const object (ignoring purity issues for the moment). That's safe because from the outside, there's no observable change to the state of the object itself, and the global AA's type (shared/thread-local) prevents race conditions.

There's no reason why we can't have the same guarantees for embedded members, without resorting to an external AA. Have a look at my DIP [1] for lazy initialization of const members, which I now realize can be adapted to this use case. Basically, just replace `lazy` by `@mutable`, and most of the DIP is still valid. I'll try updating it when I find the time.

[1] http://wiki.dlang.org/DIP85

Reply via email to