A couple of extensions to `with` that would be worthwhile

Paul Backus snarwin at gmail.com
Wed Oct 13 13:09:06 UTC 2021


On Wednesday, 13 October 2021 at 11:13:32 UTC, Andrei 
Alexandrescu wrote:
> We have an awkward idiom in the dmd source code:
>
> https://github.com/dlang/dmd/search?q=extendedPathThen
> https://github.com/dlang/dmd/search?q=toWStringzThen
>
> It's a tail wagging the proverbial dog. Clearly we could do 
> with better ways. We can improve the `with` statement as 
> follows:
>
> 1. Accept named `with`:
>
> with (auto xpath = extendPath(name)) {
>     // the only name injected here is xpath
> }
>
> All destructors for the expression involved in `with` are 
> called AFTER the with is done.

Isn't this the same thing as a normal block scope?

     {
         auto xpath = extendPath(name);
         // the name xpath is available here
         // ...
     } // xpath is destroyed here

As far as I can tell the reason a block scope isn't used in DMD 
is that these methods don't use destructors for cleanup, they use 
manual memory management. So maybe that's the real source of the 
awkwardness.

> 3. Accept `with` with colon:
>
> with (auto xpath = extendPath(name).str):
>
> The meaning is like a scoped `with` that extends though the end 
> of the scope.

This would also be useful for types like ddash's Expect [1], 
which define static factory methods for each case of a sum type. 
The example in the linked documentation could be rewritten as:

     Expect!int toInt(string str) {
         with(typeof(return)):
         import std.conv: to;
         try {
             return expected(str.to!int);
         } catch (Exception ex) {
             return unexpected(ex.msg);
         }
     }

...where the `with` statement is used to bring `expected` and 
`unexpected` into scope, and the colon avoids introducing an 
extra level of nesting.

[1] https://aliak00.github.io/ddash/ddash/utils/expect/Expect.html

> 4. Accept `with` at top level.
>
> All `with` forms that take a type should be accepted at top 
> level. This allows entire modules or fragments thereof to look 
> names up in a flexible manner.

Seems like a natural "turtles all the way down" extension of the 
above.


More information about the Digitalmars-d mailing list