guard clause style static if

Steven Schveighoffer schveiguy at yahoo.com
Tue Jul 10 13:33:39 UTC 2018


On 7/10/18 7:38 AM, kdevel wrote:
> On Tuesday, 10 July 2018 at 00:11:27 UTC, Steven Schveighoffer wrote:
>> On 7/7/18 7:28 AM, kdevel wrote:
>>> It appears not to be possible to use static if in "guard clause 
>>> style" as in
>>>
>>>     void bar (T ...) (T args)
>>>     {
>>>        static if (args.length == 0)
>>>           return;
>>>
>>>        writeln (args [0]);
>>>        return bar (args [1 .. $]);
>>>     }
>>>
>>> Is this intended?
>>
>> Yes.
>>
>> Try just a normal if -- it will have the same effect (the optimizer 
>> will eliminate the dead code), but will compile.
> 
> I would like to suggest an extension of the language by introducing
> 
>      static return Expression_opt;
> 
> which shall have the effect of a return plus that the remaining lines in 
> the current block are treated as if they were enclosed in an else block.
I think it's simpler than that. IMO, any time you have a static if that 
uses template parameters, it should be treated for purposes of detecting 
unreachable code as if it were a normal if statement. To the user 
"unreachable" code means it never can be reached. But that code CAN be 
reached with different compile-time parameters.

Your anecdote is easy to solve, but it's much more difficult to do 
something like this in a static loop.

I don't want to introduce more syntax, this is basically a lint error.

>> Of course, you have to fix your second part to only return bar if 
>> args.length > 0!
> 
> This violates DRY. Same problem as with the template constraints version 
> where the condition used in every special case has to be repeated in the 
> general case.

Sorry, but it has to try to compile this, and args[1 .. $] is invalid at 
compile time.

You can get it back to being DRY by using else.

-Steve


More information about the Digitalmars-d-learn mailing list