DIP1028 - Rationale for accepting as is

Johannes Loher johannes.loher at fg4f.de
Sun May 24 15:58:19 UTC 2020


On Sunday, 24 May 2020 at 12:14:13 UTC, aliak wrote:
> On Sunday, 24 May 2020 at 11:30:53 UTC, Johannes Loher wrote:
>> On Sunday, 24 May 2020 at 11:25:06 UTC, aliak wrote:
>>> On Sunday, 24 May 2020 at 10:40:11 UTC, Johannes Loher wrote:
>>>> does not work). But I admit that it is still a bit weird to 
>>>> have 2 different defaults.
>>>
>>> Is that any more or less weirder than having functions 
>>> inferred with different attributes based on context?
>>
>> What exactly are you referring to?
>
> Attribute inference by D, specifically template functions. The 
> attributes are inferred based on context (I don't know the 
> exact algorithm). So a function f(T)(T) when called can maybe 
> be pure, maybe safe, maybe not?

 From what I understand, it does not depend on the context but on 
the template parameters you pass to the template. I agree that it 
might be a bit confusing at first, but it makes sense if you 
realize that templates themselves are not functions but something 
that can generate functions (and other constructs) from compile 
time parameters. Why shouldn't the attributes of a generated 
function be able to depend on the parameters being passed to the 
template? Basically everything else can depend on them, too. 
Automatically inferring the attributes is just a very convenient 
way to do that. But yeah, it's not 100% consistent that they are 
not also inferred for regular functions (some people have been 
arguing for that).

However, at least for templates, there is a very good reason for 
the difference (or at least the fact that attributes are inferred 
for templates): if that was not the case, it would basically be 
impossible to write generic code that works with all the 
attribute combinations. However, the very purpose of templates is 
to enable writing generic code. They wouldn't make that much 
sense if that capability was strongly limited.

On the other hand, having different @safety defaults for bodiless 
function declarations and regular faction declarations does not 
have such a big benefit, especially when considering the fact, 
that we can have the same defaults but make @safe (default or 
explicit) bodiless function declarations a compiler error. If we 
ignore that option for some reason, it would only be dort of a 
necessity in order to prevent people from shooting them selves in 
the foot without even noticing. But there is no inherent value in 
the difference, it doesn't enable anything.

That said, I'd still prefer this variant over what DIP1028 does 
currently. It's just that I think the other option is even better 
because it is more consistent.


More information about the Digitalmars-d-announce mailing list