Can enum and immutable be unified?
Ary Borenszweig
ary at esperanto.org.ar
Thu Jul 23 06:10:13 PDT 2009
Ary Borenszweig escribió:
> Michiel Helvensteijn escribió:
> > Walter Bright wrote:
> >
> >> immutable - data that cannot change or be changed (imagine it is stored
> >> in ROM)
> >>
> >> const - read only view of data, you cannot change it but others can
> >>
> >> enum - compile time constant, has no storage
> >>
> >> The only place these overlap is in the declaration of symbolic
> >> constants. C++ has all three, but in a way that is context dependent
> >> that very few people are aware of.
> >
> > Aren't immutable and enum the same thing? At least to the programmer?
>
> Yesterday I was thiking the same thing. I think the only difference to
> the programmer between those is that you can take the address of
> something immutable, but can't take the address of a compile time constant.
>
> Now I wonder why would you like to take the address of something that's
> immutable. The times I remember passing something's address is to change
> it, something like:
>
> int x = 10;
> foo(&x);
> // now x might have changed
>
> But immutable variables cannot change, so no need to pass it by reference.
>
> The other usage is performance. If it's an immutable big struct you
> might want to pass it by reference instead of copying the whole thing.
> If you can't pass a reference to something immutable you couldn't do
> with this optimization. But in this case, the compiler could choose to
> rewrite mentions to big immutable variables as references to those in a
> transparent way to the programmer. Of course this is harder for the
> compiler writer, but it's much easier for the user.
>
> (as a starting point the compiler could do without this optimization and
> see if the users are having problems without it)
>
> I can't come up with other cases where you'd want to pass a reference to
> something immutable.
>
> So let's suppose we don't need to take an immutable varaible's address.
> We get rid of "enum" then and unify "immutable" and "enum" into the
> single "immutable" keyword. The compiler still has to determine what to
> put in ROM and what not. But I think this one is easy: primitive types
> can go in ROM, also maybe small immutable structs, maybe primitive
> arrays, but not classes or references to classes.
Sorry, I wanted to write that the compiler can choose what things are
compile-time constants and what things should go into ROM. Primitives,
small structs, etc, should be compile-time constants.
More information about the Digitalmars-d
mailing list