mutable, const, immutable guidelines
qznc
qznc at web.de
Wed Oct 9 00:17:40 PDT 2013
On Wednesday, 9 October 2013 at 04:41:35 UTC, Ali Çehreli wrote:
> > 4. Data structures should not restrict themselves to be
> mutable, const,
> > or immutable.
>
> What is the template of a struct that can be used as such?
> Providing simple values seems to be insufficient:
>
> struct MyInt
> {
> int i;
> private int[] history;
> }
>
> What else should the struct above have to make it usable as
> mutable, const, immutable?
>
> > This is a noble goal, which in reality is probably either
> trivial or
> > impossible. So I am not sure, if it is worthy to be called a
> guideline.
>
> We have to nail this down already. We have this great addition
> of immutable in the language but we either don't know how to
> use it or the language is lacking hopefully trivial things to
> make it work.
For this case, there are basically two approaches: a) prevent the
use as immutable in the first place or b) make it work as
immutable by force.
For version a) we could have a UDA like this:
@NeverImmutable struct MyInt { int i; }
auto x = immutable(MyInt)(42); // compile error
immutable y = MyInt(42); // compile error
However, the library writer would have to anticipate the private
dynamic array, which probably does not happen. Defensive coding
like putting @NeverImmutable on everything would defeat the
purpose as well.
For version b) we would relax the type system, which opens an
ugly can of worms of unknown size. Basically, immutable data
would be allowed to have mutable private data, if the author
sufficiently asserts everything is correct. Since there are lots
of interesting compiler optimizations with immutable things, I
can imagine there will be lots of subtle errors until one can
make something like this work.
At this point, I cannot imagine that there is a solution which
makes this case work, so I think we have to accept this breakage.
More information about the Digitalmars-d-learn
mailing list