Jump to page: 1 2 3
Thread overview
Associative arrays
May 10, 2021
Imperatorn
May 10, 2021
H. S. Teoh
May 18, 2021
Chris Piker
May 18, 2021
Chris Piker
May 18, 2021
Chris Piker
May 18, 2021
Mathias LANG
May 18, 2021
Chris Piker
May 18, 2021
Chris Piker
May 18, 2021
Adam D. Ruppe
May 18, 2021
Imperatorn
May 18, 2021
Adam D. Ruppe
May 18, 2021
Paul Backus
May 18, 2021
Imperatorn
May 18, 2021
Chris Piker
May 18, 2021
Imperatorn
May 18, 2021
Chris Piker
May 18, 2021
Paul Backus
May 18, 2021
Mathias LANG
May 18, 2021
Chris Piker
May 10, 2021

Sooo, when are we implementing this? 😁

https://dlang.org/spec/hash-map.html#static_initialization

May 10, 2021
On Mon, May 10, 2021 at 05:31:21PM +0000, Imperatorn via Digitalmars-d wrote:
> Sooo, when are we implementing this? 😁
> 
> https://dlang.org/spec/hash-map.html#static_initialization

This has been on the list for many years, and I haven't seen any signs of it manifesting any time soon.

In the meantime, you could simply do this:

	static immutable K[V] myAA;
	static this() {
		myAA = [
			"abc": 123,
			... // etc.
		];
	}


T

-- 
If you think you are too small to make a difference, try sleeping in a closed room with a mosquito. -- Jan van Steenbergen
May 18, 2021
On Monday, 10 May 2021 at 18:31:20 UTC, H. S. Teoh wrote:
> This has been on the list for many years, and I haven't seen any signs of it manifesting any time soon.

Hi H. S.

I assume it's not been done because it's hard.  Do you happen to know what makes it a difficult problem for compiler implementers? I don't need to know, but am curious.

Thanks,

May 18, 2021
On Tuesday, 18 May 2021 at 07:40:53 UTC, Chris Piker wrote:
> On Monday, 10 May 2021 at 18:31:20 UTC, H. S. Teoh wrote:
>> This has been on the list for many years, and I haven't seen any signs of it manifesting any time soon.
>
> Hi H. S.
>
> I assume it's not been done because it's hard.  Do you happen to know what makes it a difficult problem for compiler implementers? I don't need to know, but am curious.


I hope it stays unimplemented. AAs should be replaced by a library solution and AA literals should work with custom AAs. The special casing is not good for metaprogramming.


May 18, 2021
On Tuesday, 18 May 2021 at 07:50:06 UTC, Ola Fosheim Grostad wrote:
> I hope it stays unimplemented. AAs should be replaced by a library solution and AA literals should work with custom AAs. The special casing is not good for metaprogramming.

I'm new to D and don't come from a hard-core C++ background.  On naive first take, the fact that D had a construct resembling python dictionaries made D more attractive. In fact, it was AAs that finally tipped me in favor of trying D.

Can you tell me more about why AAs are an undesirable language feature?

May 18, 2021
On Tuesday, 18 May 2021 at 08:08:10 UTC, Chris Piker wrote:
> On Tuesday, 18 May 2021 at 07:50:06 UTC, Ola Fosheim Grostad wrote:
>> I hope it stays unimplemented. AAs should be replaced by a library solution and AA literals should work with custom AAs. The special casing is not good for metaprogramming.
>
> I'm new to D and don't come from a hard-core C++ background.  On naive first take, the fact that D had a construct resembling python dictionaries made D more attractive. In fact, it was AAs that finally tipped me in favor of trying D.
>
> Can you tell me more about why AAs are an undesirable language feature?

Hashing strategies needs contextual knowledge. But that is not the main reason. The main reason is that D needs better metaprogramming. A hashmap literal should bind to any hashtable. There is no reason to not make it a 100% library construct. Stuff it into your runtime and you would hardly notice any difference.

Golden design rule: never add language features that can be done as library constructs, ever.

May 18, 2021

On Tuesday, 18 May 2021 at 08:08:10 UTC, Chris Piker wrote:

>

On Tuesday, 18 May 2021 at 07:50:06 UTC, Ola Fosheim Grostad wrote:

>

I hope it stays unimplemented. AAs should be replaced by a library solution and AA literals should work with custom AAs. The special casing is not good for metaprogramming.

I'm new to D and don't come from a hard-core C++ background. On naive first take, the fact that D had a construct resembling python dictionaries made D more attractive. In fact, it was AAs that finally tipped me in favor of trying D.

Can you tell me more about why AAs are an undesirable language feature?

AA are definitely a great D feature IMO. But unlike other D features, they are not as composable as we'd like.

Take slices for example. They compose fairly well. You can get an int[] from the GC, a static array, malloc, or even some other library-provided buffer. While extending them is tied to the GC (a ~= b will always call the GC), sub-slicing them, batch operations (a[] = b or a[] = b[]) will work just the same no matter what underlying memory you have.

Associative arrays have none of that. They are tied to the way they've been implemented in the runtime, and predate a lot of features. They only work with qualifiers because of the C interfacing. You can't control the underlying memory, which means you can't reuse it or bind it to a buffer if you know the AA size in advance. They don't work well with qualifiers, because the compiler will error on myAA[key] = value; if is(typeof(myAA[key]) : const) because it can't know if it's an update or an insertion. We have require and update in druntime but those are not recognized by the compiler so they don't solve the problem.

The following doesn't even compile:

void main () nothrow
{
    int[int] aa;
    foreach (k, v; aa) {}
}

Because:

>

onlineapp.d(4): Error: _aaApply2 is not nothrow
onlineapp.d(1): Error: nothrow function D main may throw

Now as to why AA don't work at CT: They still use the "old" druntime approach, namely hiding all runtime magic behind extern(C) functions which are declared in the compiler frontend and defined in druntime (the linker doing the magic). This approach has the "upside" of bypassing all attributes checks (you can say that a function is @safe pure nothrow @nogc in the compiler frontend but not mark it as such in the extern(C) function and things will link), but it has many downsides: First, it's not CTFEable, meaning many things depending on the runtime had to be duplicated in the frontend; second, it can hurt performances, as it can't be inlined (although LTO might do a good job here); lastly, well, it bypass all attributes checks so when you actually have a mismatch all hell breaks loose.

There's been a few discussions about this over the year. For example, this PR from a few years ago wanted to at least allow builtin types. @IgorStepanov did some work, e.g. here and here (and more). Martin Nowak IIRC also did quite some work on it.

May 18, 2021

On Tuesday, 18 May 2021 at 08:22:56 UTC, Ola Fosheim Grostad wrote:

>

The main reason is that D needs better metaprogramming.

That's an interesting take.

So far, with only a month's usage of D I'm seeing so much meta-programming capability that it actually worries me a bit. With string mixins and so many other meta programming features around I'm starting to think that reading other people's D code is going to be quite difficult, similar to perl.

>

Golden design rule: never add language features that can be done as library constructs, ever.

This sounds like a reasonable position. Imagine for a second that AAs were implemented as a library. What would the library equivalent of this:

long[string] aa = ["foo": 5, "bar": 10, "baz": 2000 ];

look like?

May 18, 2021

On Tuesday, 18 May 2021 at 09:14:46 UTC, Chris Piker wrote:

>

This sounds like a reasonable position. Imagine for a second that AAs were implemented as a library. What would the library equivalent of this:

long[string] aa = ["foo": 5, "bar": 10, "baz": 2000 ];

look like?

https://github.com/dlang/druntime/blob/bf21d1bad623c6988d644117c3c0aa4d4f08b771/src/object.d#L2657-L2660

The playground will show the call to _d_assocarrayliteralTX if you select ASM.

May 18, 2021

On Tuesday, 18 May 2021 at 08:54:00 UTC, Mathias LANG wrote:

Thanks for the description, that was informative :)

>

The following doesn't even compile:

void main () nothrow
{
    int[int] aa;
    foreach (k, v; aa) {}
}

So basically I can use AAs, so long as I don't put them in critical software since they are always going to throw. No trouble, I can live with that, it's good to know that up front.

« First   ‹ Prev
1 2 3