scope(exit) with expected library

Steven Schveighoffer schveiguy at gmail.com
Wed Aug 25 14:42:07 UTC 2021


On 8/25/21 10:22 AM, Paul Backus wrote:
> On Wednesday, 25 August 2021 at 14:04:54 UTC, WebFreak001 wrote:
>> Would it be possible to extend `scope(exit)` and `scope(success)` to 
>> trigger properly for functions returning `Expected!T` as defined in 
>> the [expectations](https://code.dlang.org/packages/expectations) and 
>> [expected](https://code.dlang.org/packages/expected) DUB libraries?
>>
>> For example is it possible to make this work as expected:
>> ```d
>> Expected!int divide(int a, int b) nothrow
>> {
>>     scope (failure) writeln("division failed");
>>     scope (success) writeln("division succeeded");
>>
>>     if (b == 0) return err!int("division by zero");
>>     return ok(a / b);
>> }
>> ```
> 
> Probably the only principled way to make this work would be to define 
> some kind of "concept"/structural interface that's recognized by the 
> compiler to mean "this is an error-handling type", in the same way that 
> the compiler recognizes `empty`/`front`/`popFront` to mean "this is an 
> iterable type".
> 
> Even then, it would require some pretty invasive language changes (and 
> some pretty gnarly code in the compiler), but it's at least 
> *theoretically* possible.

I think it's possible to work with some mechanics that aren't 
necessarily desirable. Something like:

```d
ErrorHandler error = registerErrorHandler;
error.onFailure({writeln("division failed");});
error.onSuccess({writeln("division succeeded");});

...
```

On returning `err`, the registration would trigger a flag saying an 
error is occurring, and call the right callback when `ErrorHandler` is 
destructing. The cleanup of the return value would clean up the error 
condition. It would be messy and likely brittle.

I've also advocated in the past that it would be nice to have access to 
the things that are causing the success, failure, etc.

Like `scope(failure, exception) writeln("Exception being thrown is ", 
exception)`

Could be extended to:

```d
scope(success, r) if(r.isError) writeln("division failed");
                   else          writeln("division succeeded");
```

That `scope(success)` kinda sucks though...

-Steve


More information about the Digitalmars-d-learn mailing list