On Saturday, 13 May 2017 at 10:27:25 UTC, Timon Gehr wrote:
On 12.05.2017 18:17, Mike Parker wrote:
The first stage of the formal review for DIP 1003 [1], "Remove body as a Keyword", is now underway. From now until 11:59 PM ET on May 26 (3:59 AM GMT on May 27), the community has the opportunity to provide last-minute feedback. If you missed the preliminary review [2], this is your chance
to provide input.

At the end of the feedback period, I will submit the DIP to Walter and Andrei for their final decision. Thanks in advance to those of you who
participate.

[1]
https://github.com/dlang/DIPs/blob/fbb797f61ac92300eda1d63202157cd2a30ba555/DIPs/DIP1003.md


[2] http://forum.dlang.org/thread/qgxvrbxrvkxtimzvn...@forum.dlang.org

Option 1 is good: There is nothing wrong with the current syntax. [1]

Option 2 is bad: It's the function body, not the function.

Option 3 is ugly: There is no precedent for '...{}{}' belonging to the same declaration or statement.

Hmm, I guess it depends on how you format your code. I noticed that you tend to avoid whitespace when formatting your own code (e.g. [0]) so if '{}{}' was allowed (in addition to '()()') your code would look even more cryptic
(at least to me) :P

The Phobos style guide, which also mostly matches my personal preference
is to write code like this:

T sqrt(T)(T n)
if (isNumeric!(Unqual!T) || is(Unqual!T == BigInt))
in
{
    assert(n >= 0);
}
out (result)
{
    assert(result * result == n);
}
body
{
    //Implementation
}

If the block is short I sometimes write it like so:

T sqrt(T)(T n)
if (isNumeric!(Unqual!T) || is(Unqual!T == BigInt))
in { assert(n >= 0); }
out (result) { assert(result * result == n); }
body
{
    //Implementation
}

With removal of 'body', the code would look like so:

T sqrt(T)(T n)
if (isNumeric!(Unqual!T) || is(Unqual!T == BigInt))
in { assert(n >= 0); }
out (result) { assert(result * result == n); }
{
    //Implementation
}

Which I actually think looks good.

A small improvement, in addition to omitting 'body' would be to allow omitting the braces if the 'in' or 'out' blocks contain only a single
statement (similar to 'if', 'foreach', etc.) and to add a similar
syntax sugar alternative for template constraints:

T sqrt(T)(T n)
if Unqual!T U: isNumeric!U || is(U == BigInt)
in n >= 0
out (result) result * result == n
{
    //Implementation
}


[0]:
https://github.com/tgehr/d-compiler/blob/175ccb81d6f35feb4fcf3050180ccf6357b4fa51/semantic.d#L845
https://github.com/tgehr/d-compiler/blob/175ccb81d6f35feb4fcf3050180ccf6357b4fa51/parser.d#L122
https://github.com/tgehr/d-compiler/blob/175ccb81d6f35feb4fcf3050180ccf6357b4fa51/semantic.d#L131

Reply via email to