best/proper way to declare constants ?

H. S. Teoh hsteoh at quickfur.ath.cx
Thu Aug 5 15:26:33 UTC 2021


On Thu, Aug 05, 2021 at 03:09:13PM +0000, someone via Digitalmars-d-learn wrote:
> On Thursday, 5 August 2021 at 10:28:00 UTC, Steven Schveighoffer wrote:
> 
> > H.S. Teoh, I know you know better than this ;) None of this is
> > necessary, you just need `rtValue` for both runtime and CTFE (and
> > compile time parameters)!

Haha, I haven't used this particular feature of D recently, so probably
my memory is failing me. ;-)


> > Now, the original question is about *associative arrays*, which are
> > a different animal. Those, you actually have to initialize using a
> > static constructor, and does indeed need both an enum and a static
> > immutable, as CTFE currently does not understand runtime AAs. This
> > is a huge issue since you do need silly things like the `if(__ctfe)`
> > statement you wrote, and keep an enum handy for those cases which is
> > identical to the static immutable. We really need to fix this.
> 
> When you say "We really need to fix this" you mean that *eventually*
> associative-arrays will be available at compile-time ?
[...]

AA's are already available at compile-time.  You can define them in CTFE
and pass them around as template arguments.

What doesn't work is initializing global static immutable AA's with
literals. Currently, you need this workaround:

	struct Data { /* whatever you want to store here */ }
	static immutable Data[string] aa;
	shared static this() {
		aa = [
			"abc": Data(...),
			"def": Data(...),
			// ... etc.
		];
	}

Unfortunately, this also means you can't access the value of `aa` at
compile-time. So you need a separate enum in order to access AA values
at compile-time.

Full runnable example:
---------------
enum ctValue = [
	"abc": 123,
	"def": 456,
];

static immutable int[string] rtValue;
shared static this() {
	rtValue = ctValue;
}

// Compile-time operations
enum x = ctValue["abc"];
enum y = ctValue["def"];
static assert(x == 123 && y == 456);

// Runtime operations
void main() {
	assert(rtValue["abc"] == 123);
	assert(rtValue["def"] == 456);
}
---------------


T

-- 
My father told me I wasn't at all afraid of hard work. I could lie down right next to it and go to sleep. -- Walter Bright


More information about the Digitalmars-d-learn mailing list