Can enum and immutable be unified?

Robert Fraser fraserofthenight at gmail.com
Thu Jul 23 12:43:00 PDT 2009


Don wrote:
> Ary Borenszweig wrote:
>> 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.
>>
>> Is there something fundamentally wrong with this reasoning?
> 
> AFAIK, the only reason 'enum' manifest constants exist in D2 is because 
> of linking limitations. OPTLINK isn't smart enough to be able to discard 
> immutable references. There's no need to use them, unless you have 
> something like the Windows headers, where they're an enormous bloat if 
> they aren't discarded. Most people should forget they exist.

Since objconv works with OMF now, how hard would it be to get a workflow 
going to use a different linker on Windows? Every other post these days 
seems to be "oh, it's an optlink issue"



More information about the Digitalmars-d mailing list