Attribute transference from callbacks?
Steven Schveighoffer
schveiguy at gmail.com
Sun Dec 8 19:19:21 UTC 2024
On Sunday, 8 December 2024 at 05:54:40 UTC, Manu wrote:
> I've been trying out an API strategy to use sink functions a
> lot more to hoist the item allocation/management logic to the
> user and out from the work routines. This idea has received a
> lot of attention, and I heard a lot of people saying this was a
> planned direction to move in phobos and friends.
>
> ```d
> void parseThings(string s, void delegate(Thing) sink)
> {
> //...
> sink(Thing());
> //...
> }
> ```
>
> We have a serious problem though; a function that receives a
> sink function
> must transfer the attributes from the sink function to itself,
> and we have
> no language to do that...
> What are the leading strategies that have been discussed to
> date? Is there
> a general 'plan'?
I've proposed something like the following in the past, but I
don't know how much appetite there is for it:
```d
// assuming Thing() is @nogc nothrow @safe, but not pure
void parseThings(string s, @called void delegate(Thing) sink)
@nogc nothrow @safe
{
sink(Thing());
}
```
Essentially, how this would work is that the compiler would
consider all code inside the function except the call of the
delegate to be attributed with the provided attributes. However,
the delegate call will *always work*. All that will happen is
that the call to `parseThings` will have any restrictions removed
that aren't on the delegate.
So e.g. a delegate of `@nogc pure` but not `nothrow` or `@safe`
will mean `parseThings(dg)` will be treated like it's `@nogc`.
Because the list of attributes `@nogc nothrow @safe` is
logic-anded with `@nogc pure`.
No recompile is necessary.
If you want to insist that some attribute must be on the
delegate, you can add the attribute to the delegate parameter. So
if I wanted to insist that you must pass in at least a `@safe`
delegate:
```d
void parseThings(string s, @called void delegate(Thing) @safe
sink) { ... }
```
As far as I know, there is no plan to make something like this
happen.
-Steve
More information about the Digitalmars-d
mailing list