Help improve error message

Petar Petar
Mon May 8 22:12:53 UTC 2023


On Monday, 8 May 2023 at 16:08:32 UTC, Steven Schveighoffer wrote:
> [..]
>
> That possibly could improve the situation. UFCS "properties" 
> for AAs are kinda sucky.
>
> But that still leaves normal array properties, like `.dup`. I 
> don't see us ever changing slices to templated structs.

Hmm, that doesn't sound like the worst idea. From implementation 
point of view, we much be extra careful to avoid any sort of 
pessimization (e.g. template code bloat), since slices are used 
everywhere, but other than that, why not?

In some languages, even built-in integer types are 
"library-defined", see e.g.:

Swift:
* 
[`stdlib/public/core/IntegerTypes.swift.gyb`](https://github.com/apple/swift/blob/main/stdlib/public/core/IntegerTypes.swift.gyb)
Rust:
* 
[`library/core/src/ops/arith.rs`](https://github.com/rust-lang/rust/blob/a0111af531178e48375f14f838d7a2298524067c/library/core/src/ops/arith.rs#L94-L109)
* 
[`library/core/src/num/int_macros.rs`](https://github.com/rust-lang/rust/blob/a0111af531178e48375f14f838d7a2298524067c/library/core/src/num/int_macros.rs)
* 
[`library/core/src/num/mod.rs`](https://github.com/rust-lang/rust/blob/a0111af531178e48375f14f838d7a2298524067c/library/core/src/num/mod.rs#L245-L264)

Anyway, let's not get ahead of ourselves.

>> 
>> Speaking of this, I now remembered that you created this 
>> project: https://github.com/schveiguy/newaa
>> 
>> What language changes are necessary before we can replace the 
>> built-in AAs with a completely library-based solution?
>
> Two problems. One is straightforward, but requires some 
> language updates: Having some mechanism to tell `opIndex` that 
> the result should be inserted if it doesn't exist. Used in 
> cases like:
> ```d
> int[int][int] aa;
>
> ++aa[42][24]; // currently compiles
> ```

Yeah, the so-called 
[autovivification](https://en.wikipedia.org/wiki/Autovivification). For a moment I was confused as to what's the problem with simply:
1. Having `opIndex` return by `ref`, so you can mutate the value 
in-place.
2. Having `opIndex` construct the value on first access, 
something along the lines of:
   `if (key !in impl) return impl.at(key).emplace!Value();`

But then I remembered that `aa[missingKey]` actually throws a 
`RangeError` and we wouldn't be able to replicate the behaviour 
if we did 2.

I wonder if the compiler simply could lower:

```d
int[int][int] aa;
++aa[42][24];
```

to:

```d
int[int][int] aa;
++aa.require(42).require(24);
```

Would that address this issue?

> The second is not as straightforward. There are a few implicit 
> casts that have no analog for structs. Without some way to say 
> e.g. `Foo!(T)` can be casted implicitly to `Foo!(const(T))`, I 
> don't know how we can figure that one.

Thanks for reminding me, I think this was discussed many times in 
the past, IIRC it was most recently brought up by deadalnix in 
the sumtypes thread.

If we consider this issue unsolvable for the time being, a 
pragmatic way forward would be to consider the following:
The compiler already special cases `T[]` and `V[K]` types with 
regards to type qualifiers. Perhaps we can keep this code around 
and update it to work with the new AA implementation. That would 
mean that the implicit type qualifier conversion won't work if 
one directly imports the AA type: 
`core.associative_array.Hash!(K, V)`, however existing code that 
uses the `V[K]` syntax would continue working fine.

> Aside from that, there are a lot of things that can be done to 
> newaa that will bring it closer to usable. I just haven't done 
> them yet.
>
> The biggest use case right now is building an AA at compile 
> time, and using it at runtime.

Nevertheless, I think you have very solid progress so far! 
Hopefully, it won't be too long before we incorporate it in some 
form in Druntime!




More information about the Digitalmars-d mailing list