Try blocks are trying

bauss jj_1337 at live.dk
Mon Oct 11 12:20:11 UTC 2021


On Monday, 11 October 2021 at 11:42:52 UTC, FeepingCreature wrote:
> On Monday, 11 October 2021 at 11:05:47 UTC, bauss wrote:
>> On Monday, 11 October 2021 at 09:27:30 UTC, FeepingCreature
>>> `export try` is the only feasible approach I can see offhand.
>>
>> Using alias this, opAssign and a boolean value you can 
>> actually do something like this:
>>
>> ```d
>> public struct BindOnce(T)
>> {
>>     private bool _isSet;
>>     private T _value;
>>
>>     alias _value this;
>>
>>     void opAssign(T rhs)
>>     {
>>         if (_isSet)
>>         {
>>             throw new Error("The value has already been set.");
>>         }
>>
>>         _isSet = true;
>>         _value = rhs;
>>     }
>>
>>     string toString() { return to!string(_value); } // 
>> Required for writeln
>> }
>> ```
>>
>> Example Usage:
>>
>> ```
>> int getNumber(int input)
>> {
>>     if (input == 0) throw new Exception("This function doesn't 
>> allow multiplications of zero.");
>>     return input * 2;
>> }
>>
>> void main()
>> {
>>     BindOnce!int n;
>>     try
>>     {
>>         n = getNumber(20);
>>         //n = getNumber(40); // Uncommenting this line will 
>> throw the error "The value has already been set."
>>
>>         writeln(n);
>>     }
>>     catch (Exception e)
>>     {
>>         writeln(e);
>>         writeln(n);
>>     }
>> }
>> ```
>>
>> Of course this assumes you're able to allow runtime errors and 
>> that you don't blindly catches them and ignores them either 
>> (which you shouldn't as Error shouldn't be recoverable!)
>
> I almost don't want to say it.
>
> Cough immutable cough...
>
> That's why this really needs language support.
>
> (Also I'd just use `Nullable` or `Rebindable` irl.)

Yeah, I'm aware it's not necessarily "immutable" in the standard 
sense, but it is in the technical sense.

Of course the export try would be much better but this is a 
somewhat viable solution until, as you can easily replace it with 
immutable once/if ever supported.


More information about the Digitalmars-d mailing list