cast(function qualifier)

Quirin Schroll qs.il.paperinik at gmail.com
Mon Feb 17 11:26:59 UTC 2025


On Saturday, 15 February 2025 at 13:28:38 UTC, Paul Backus wrote:
> On Wednesday, 5 February 2025 at 11:22:59 UTC, Quirin Schroll 
> wrote:
>> I generally dislike the qualifier casts because they override 
>> all existing qualifiers.
>> * `cast(qualifiers)` removes all qualifiers, then adds the 
>> given qualifiers (includes `cast()`).
>>
>> It’s a blunt tool that makes making precise cuts hard. You 
>> locked a mutex and and now are good to go with casting away 
>> `shared`? Well, too bad, you did `cast()` and also removed a 
>> `const`, welcome to UB town. You made sure some C API doesn’t 
>> mutate your stuff and cast away `const`? Well, too bad, you 
>> also cast away `shared` and now you’re debugging race 
>> conditions.
>>
>> My idea is to use `...` to abbreviate the type of the operand 
>> within the `cast`; that would make `cast(...)` a no-op.
>> Qualifier manipulations go in front of `...` and (member) 
>> function attribute manipulations trail behind. `cast(const ... 
>> const) dg` adds(!) `const` both as a qualifier and a member 
>> function attribute to the type of `dg`.
>>
> [...]
>>
>> ```d
>> shared inout void delegate() @safe const dg;
>>
>> cast() dg; // void delegate() const @safe
>> cast(!shared ...) dg; // inout void delegate() const @safe
>> cast(-shared ...) dg; // inout void delegate() const @safe
>> cast(-const ...) dg; // error, `dg` isn’t const
>> cast(const ...) dg; // const inout shared void delegate() 
>> const @safe
>> cast(... !const) dg; // inout shared void delegate() @safe
>> cast(... !@safe) dg; // inout shared void delegate() const
>> cast(... !pure) dg; // inout shared void delegate() const @safe
>> cast(... -pure) dg; // error, `dg` isn’t pure
>> cast(... pure nothrow) dg; // const inout shared void 
>> delegate() const nothrow pure @safe
>> ```
>
> I understand where you're coming from but unfortunately the 
> result looks like line noise.

Remember that you generally won’t do this too often anyway.

> Even if it's more verbose, I would much rather read code like 
> the following:
>
> ```d
> alias Dg = typeof(dg);
> cast(Unshared!Dg) dg; // inout void delegate() const @safe
> cast(UnconstContext!Dg) dg; // inout shared void delegate() 
> @safe
> cast(Unsafe!Dg) dg; // inout shared void delegate() const
> cast(Impure!Dg) dg; // inout shared void delegate() const @safe
> cast(Pure!(Nothrow!Dg)) dg; // const inout shared void 
> delegate() const nothrow pure @safe
> ```

This is template instantiation hell.


More information about the dip.ideas mailing list