digitalmars.D.learn - enum value vs. immutable
- CJS (7/7) Dec 01 2013 I was reading the enum page of Ali Çehreli's (excellent) D book
- =?UTF-8?B?QWxpIMOHZWhyZWxp?= (27/33) Dec 01 2013 After realizing the other day that even 'static const' can be used for
- Maxim Fomin (15/35) Dec 01 2013 You can instatiate templates not only with enums. Main pro for
- =?UTF-8?B?QWxpIMOHZWhyZWxp?= (21/39) Dec 03 2013 return.
- Maxim Fomin (4/31) Dec 03 2013 Kenji is working on this
- bearophile (6/9) Dec 02 2013 Lot of time ago I think Don suggested to disallow enum dynamic
- Sergei Nosov (6/13) Dec 01 2013 enum is a compile-time constant and an immutable variable is not.
- Sergei Nosov (3/17) Dec 01 2013 Typo - "the string is the same thing as immutable(char)[]" in D
- Jonathan M Davis (19/26) Dec 02 2013 enum doesn't create a variable, so if all you really want is for the val...
I was reading the enum page of Ali Çehreli's (excellent) D book
(http://ddili.org/ders/d.en/enum.html), and I'm confused by an
enum value (not enum type), such as
enum secondsPerDay = 60 * 60 * 24;
In that situation I would have used an immutable variable. Is
there any reason to prefer enum vs. immutable when defining
constants?
Dec 01 2013
On 12/01/2013 09:57 PM, CJS wrote:
I was reading the enum page of Ali Çehreli's (excellent) D book
(http://ddili.org/ders/d.en/enum.html), and I'm confused by an enum
value (not enum type), such as
enum secondsPerDay = 60 * 60 * 24;
In that situation I would have used an immutable variable. Is there any
reason to prefer enum vs. immutable when defining constants?
After realizing the other day that even 'static const' can be used for
template instantiations, I am not sure myself anymore. :)
Simple rules are great. I wanted to accept the following guidelines,
none of which are clear cut:
1) Prefer enum first because enum values can be used for template
instantiations.
2) Prefer immutable next because it provides stronger guarantees.
3) Prefer const last as it erases immutable attribute if present. (We
can't know just by looking at a reference to const whether the original
value has been immutable or mutable.)
The first item needs qualification: Do not use enum for arrays and
associative arrays, because enum is like copy+pasting the definition
everywhere the enum is used. It is expensive to initialize arrays and AAs.
The second item needs qualification: immutable is not just a stronger
const, it is a requirement, a burden. It requires that the object is
deeply immutable and it is also a burden on types: They cannot contain
mutable references. (This affects future development; you can't add
mutable references to a type that has already been used as immutable
somewhere in the code.)
So, it is not a clear cut decision because it depends on the type as
well. For example, these days I use const even for manifest constants
like 60 * 60 * 24 because for all practical purposes it is a manifest
constant! This must be new in D; I don't think it worked that way but it
works even with CTFE now. Additionally const is shorter to type and
easier on the eyes. :)
Ali
Dec 01 2013
On Monday, 2 December 2013 at 07:27:25 UTC, Ali Çehreli wrote:On 12/01/2013 09:57 PM, CJS wrote:You can instatiate templates not only with enums. Main pro for enums is that they are CT values.I was reading the enum page of Ali Çehreli's (excellent) Dbook(http://ddili.org/ders/d.en/enum.html), and I'm confused byan enumvalue (not enum type), such as enum secondsPerDay = 60 * 60 * 24; In that situation I would have used an immutable variable. Isthere anyreason to prefer enum vs. immutable when defining constants?After realizing the other day that even 'static const' can be used for template instantiations, I am not sure myself anymore. :) Simple rules are great. I wanted to accept the following guidelines, none of which are clear cut: 1) Prefer enum first because enum values can be used for template instantiations.3) Prefer const last as it erases immutable attribute if present. (We can't know just by looking at a reference to const whether the original value has been immutable or mutable.)It is interesting to know where such advices come from. Const in D is useless except as as parameter qualifier, method qualifier, tool to alias const data and non-const data and as qualifier of some field - member of aggregate. Writing code like const int i = SOME_VALUE; is loosing advantages of immutable or enum while gaining nothing in return. It is C++ism like follwoing code: struct S { public: this(type){} ... } or static Type t; // in module scope
Dec 01 2013
On 12/01/2013 11:48 PM, Maxim Fomin wrote:The confusion is, some const values are CT values as well.1) Prefer enum first because enum values can be used for template instantiations.You can instatiate templates not only with enums. Main pro for enums is that they are CT values.return. That works for some types as both enum and immutable have their problems: * enum is no good for arrays and AAs as it is very likely to be unnecessarily slow. * immutable is no good for types that contain mutable references at least during assignment: struct S { int i; int[] others; } void main() { auto a = S(42); immutable b = a; // Error: cannot implicitly convert expression (a) of type S to immutable(S) }3) Prefer const last as it erases immutable attribute if present. (We can't know just by looking at a reference to const whether the original value has been immutable or mutable.)It is interesting to know where such advices come from. Const in D is useless except as as parameter qualifier, method qualifier, tool to alias const data and non-const data and as qualifier of some field - member of aggregate. Writing code like const int i = SOME_VALUE; is loosing advantages of immutable or enum while gaining nothing inIt is C++ism like follwoing code: struct S { public: this(type){} ... } or static Type t; // in module scopeBoth of those do happen. ;) Ali
Dec 03 2013
On Tuesday, 3 December 2013 at 08:28:23 UTC, Ali Çehreli wrote:That works for some types as both enum and immutable have their problems: * enum is no good for arrays and AAs as it is very likely to be unnecessarily slow. * immutable is no good for types that contain mutable references at least during assignment: struct S { int i; int[] others; } void main() { auto a = S(42); immutable b = a; // Error: cannot implicitly convert expression (a) of type S to immutable(S) }Kenji is working on this http://wiki.dlang.org/DIP49Yes, this isn't good at all.It is C++ism like follwoing code: struct S { public: this(type){} ... } or static Type t; // in module scopeBoth of those do happen. ;) Ali
Dec 03 2013
Ali Çehreli:Do not use enum for arrays and associative arrays, because enum is like copy+pasting the definition everywhere the enum is used. It is expensive to initialize arrays and AAs.Lot of time ago I think Don suggested to disallow enum dynamic and associave arrays. enum is partially broken, but I am not seeing much effort in trying to fix it. Bye, bearophile
Dec 02 2013
On Monday, 2 December 2013 at 05:57:33 UTC, CJS wrote:
I was reading the enum page of Ali Çehreli's (excellent) D book
(http://ddili.org/ders/d.en/enum.html), and I'm confused by an
enum value (not enum type), such as
enum secondsPerDay = 60 * 60 * 24;
In that situation I would have used an immutable variable. Is
there any reason to prefer enum vs. immutable when defining
constants?
enum is a compile-time constant and an immutable variable is not.
As an example, in order to create a enum variable you have to
know it's value at compile time, e.g. you can't read it from
file. On the contrary, you can read a string from file and string
is the same thing as immutable(char) in D.
Dec 01 2013
On Monday, 2 December 2013 at 07:31:56 UTC, Sergei Nosov wrote:On Monday, 2 December 2013 at 05:57:33 UTC, CJS wrote:Typo - "the string is the same thing as immutable(char)[]" in D (note the rectangular braces)I was reading the enum page of Ali Çehreli's (excellent) D book (http://ddili.org/ders/d.en/enum.html), and I'm confused by an enum value (not enum type), such as enum secondsPerDay = 60 * 60 * 24; In that situation I would have used an immutable variable. Is there any reason to prefer enum vs. immutable when defining constants?enum is a compile-time constant and an immutable variable is not. As an example, in order to create a enum variable you have to know it's value at compile time, e.g. you can't read it from file. On the contrary, you can read a string from file and string is the same thing as immutable(char) in D.
Dec 01 2013
On Monday, December 02, 2013 06:57:32 CJS wrote:
I was reading the enum page of Ali Çehreli's (excellent) D book
(http://ddili.org/ders/d.en/enum.html), and I'm confused by an
enum value (not enum type), such as
enum secondsPerDay = 60 * 60 * 24;
In that situation I would have used an immutable variable. Is
there any reason to prefer enum vs. immutable when defining
constants?
enum doesn't create a variable, so if all you really want is for the value to
be used and don't care about having an actual variable, there's really no
reason to use an immutable variable. Also, enum has the advantage that it
_has_ to be known at compile time even if it's a local variable, so its value
with be determined at compile time, not runtime, which is almost always an
advantage.
The main situations where you should prefer an immutable variable are for
arrays and AAs or for any type or situation where the value needs to be
determined at runtime or where it would be better if it were. The main problem
with arrays and AAs and enums, is that you end up allocating a new one every
time the enum is used, which won't happen with a variable and isn't a problem
for other types of enums (as any other type which would be allocated on the
heap can't be an enum). Strings are an exception with regards to arrays as
string literals end up in a special place in memory rather than being
duplicated, so you don't end up with an allocation every time you use it.
Overall though, it's better to use enum for constants. Using a variable just
creates extra overhead (minimal though it may be).
- Jonathan M Davis
Dec 02 2013









"Maxim Fomin" <maxim maxim-fomin.ru> 