sumtypes for D

Vladimir Panteleev thecybershadow.lists at gmail.com
Tue Nov 29 23:56:40 UTC 2022


On Monday, 28 November 2022 at 09:27:11 UTC, Walter Bright wrote:
> I've written most of a DIP for one. Should I:

I really wish that instead of adding more language features, we 
would improve the language so that things like this are 
implementable *in* the language.

I'm not sure about the argument that not everyone might use the 
same type if it's implemented as a custom type. Even if one were 
to argue that not everyone uses Phobos, the implementation can go 
into Druntime, which is an extension of the compiler, which 
solves this problem.

The example in the DIP about null pointers is wrong. It can still 
be useful to distinguish between non-null pointers, null 
pointers, and some third state such as "no pointer". 
`Nullable!(Nullable!(Nullable!int)) foo` is perfectly valid.

We don't even need a standardized `NonNull` type or trait or 
whatever. Leverage existing D features instead:

```d
template nullIsValid(T)
{
     static if (is(T == struct))
         enum nullIsValid = {
             try
             {
                 union U
                 {
                     ubyte[T.sizeof] bytes = 0;
                     T t;
                 }
                 U u;
                 assert(u.t); // call invariant
                 return true; // no exception was thrown - null is 
a valid state
             }
             catch (Throwable e)
                 return false; // exception was thrown - null is 
an INVALID state
         }();
     else
         enum nullIsValid = true;
}
```

or something like that. Currently it doesn't work because you 
can't call struct invariants directly, and can't catch 
`assert(false)` in CTFE. But, these are fixable and examples of 
things that would improve metaprogramming at a fundamental, 
building-block level and enable building more cool high-level 
types and data structures, not just sum types.



More information about the Digitalmars-d mailing list