Thread overview
Scope guards style guide
2 days ago

The D Style[0] doesn’t specify how scope guards should be written AFAICT.

scope(exit) action;

scope (exit) action;

scope(exit)
    action;

scope (exit)
    action;

Currently, Phobos mixes all variants.

  • scope\(exit\).+\n: 316 matches in 42 files
  • scope \(exit\).+\n: 14 matches in 6 files
  • scope\(exit\)\n: 38 matches in 12 files
  • scope \(exit\)\n: 11 matches in 6 files

(Numbers might be slightly different for ~master.)

Is there any official recommendation on which style to use in which situation?

The first variant seems to be preferred in practice.
Nevertheless, it differs from version (…) statements that have a space in between.

[0] https://dlang.org/dstyle.html

2 days ago

On Sunday, 30 March 2025 at 21:47:22 UTC, Elias Batek (0xEAB) wrote:

>

Currently, Phobos mixes all variants.

Updates results:

  • scope\((?:(?:exit)|(?:failure)|(?:success))\).+$ 387 matches in 46 files
  • scope \((?:(?:exit)|(?:failure)|(?:success))\).+$: 18 matches in 9 files
  • scope\((?:(?:exit)|(?:failure)|(?:success))\)$: 59 matches in 15 files
  • scope \((?:(?:exit)|(?:failure)|(?:success))\)$: 15 matches in 7 files

(Match counts for ~master might be slightly different.)

2 days ago
On Sunday, March 30, 2025 3:47:22 PM MDT Elias Batek (0xEAB) via Digitalmars-d wrote:
> *The D Style*[0] doesn’t specify how scope guards should be written AFAICT.
>
> ```
> scope(exit) action;
>
> scope (exit) action;
>
> scope(exit)
>      action;
>
> scope (exit)
>      action;
> ```
>
>
> Currently, Phobos mixes all variants.
>
> - `scope\(exit\).+\n`: 316 matches in 42 files
> - `scope \(exit\).+\n`: 14 matches in 6 files
> - `scope\(exit\)\n`: 38 matches in 12 files
> - `scope \(exit\)\n`: 11 matches in 6 files
>
> (Numbers might be slightly different for `~master`.)
>
> **Is there any official recommendation on which style to use in which situation?**
>
> The first variant seems to be preferred in practice. Nevertheless, it differs from `version (…)` statements that have a space in between.
>
> [0] https://dlang.org/dstyle.html

Well with regards to

    scope(exit)
        action;

vs

    scope(exit) action;

that's pretty much the same as

    if (cond)
        action;

vs

    if (cond) action;

and we don't say anything about that in the style guide either. I expect that putting it on the next line is more common with if statements, but there probably are some cases where it goes on the same line. Either way, we clearly haven't felt the need to get picky about it with if, so I don't know that it's worth getting picky about it with scope.

As for scope(exit) vs scope (exit), in most places, the guide wants a space between the keyword and the parens, but for assert, it doesn't. So, I guess that it's a question of whether it's more like assert or more like other keywords. Honestly, the logic of it never made sense to me. I don't put spaces between keywords and parens in my own code, and I see no value in it, but Andrei wanted to have the spaces because they weren't functions. Personally, I fail to see why that matters, but clearly it does with how he thinks about things. And that's why the style guide is the way that it is.

scope(exit) could arguably viewed as a single keyword, since it kind of is in term of how it's used, but it isn't actually. It could also be viewed as needing a space simply because we require that for keywords in general. But I don't know why assert is different. Maybe Andrei thinks of it more like a function, and scope(exit) certainly doesn't fit that thought process.

Personally, I'd favor not having the space, just because I think that all of those spaces are unnecessary cruft, but we require them all over the place for other stuff. So, I don't know. Probably the most consistent thing would be to require the space simply because it's required for all of the other keywords except assert.

- Jonathan M Davis