Rebooting the __metada/__mutable discussion

Timon Gehr timon.gehr at gmx.ch
Sun Apr 10 14:34:41 UTC 2022


On 10.04.22 02:04, Zach Tollen wrote:
> On Saturday, 9 April 2022 at 17:22:38 UTC, Timon Gehr wrote:
>> Your proposal is not simpler.
> 
> It is simpler.

If `@system` and `__metadata` are separate annotations, you get:

- `@system` rules
- `__metadata` rules

If you conflate them, you get:

- `@system` rules
- `__metadata` rules
- Weird interactions between the rules
- Additional arbitrary rules to be able to pretend the rules for the 
different annotations are compatible anyway

The additional rules and weird interactions are what's causing 
complexity, in addition to the misnamed qualifier and the significantly 
enhanced area of contact between D users and inherent `__metadata` 
weirdness.

> The only question is whether that simplicity comes at too 
> high a cost.
> ...

If "simplicity" is causing costs, you are probably doing it wrong. Don't 
try to make things "simpler" than they are. It's a source of complexity 
and further ad-hoc patches.

>> Your proposal fails to meet your own standards.
> 
> I don't know if it meets my standards or not. I would need an example 
> where a variable which was either explicitly marked, or inferred 
> `@system`, and implemented as desired with that label, then changed its 
> behavior as a result of also implicitly having the privileges of 
> `__mutable`.
> 

It's not a privilege if it's undesirable. Also, you have been given 
multiple examples by now.

(You removed relevant context here.)
>> I see what you did there. I can do that too: Clearly you think that 
>> simplicity and expressiveness are both monotone functions of the 
>> number of attributes that are in the language. If what you say were 
>> true, we should conflate @safe and pure, as well as @nogc and nothrow 
>> because that would be "simpler". That's ridiculous!
> 
> No I'm saying that simplicity and expressiveness are tradeoffs.

I was objecting to your setting up of a straw man that you then 
proceeded to attack. I then simply demonstrated my ability to do the 
same, expecting it might sway you as you seem to enjoy that kind of 
reasoning yourself. Unfortunately this has not worked out.

In any case, there are very simple systems that are very expressive. You 
want to be in that quadrant.

> The Go 
> language, for example, traded a lot of expressiveness for simplicity. 
> That doesn't make it bad language design.

I don't think this is entirely the case. They made some miscalculations 
early on and are now left with a language that is neither as simple nor 
as expressive as it should have been, nor as orthogonal as they claim.

> It means they weighed the pros and the cons, and they made a decision.
> ...

It's probably one level further away from that. They didn't spend a lot 
of effort to make a good language. They just spent vastly more time 
writing the compiler and libraries and my understanding is they did a 
pretty decent job there. Also, perhaps they actively wanted to avoid 
having a cerebral community that cares about abstract things such as PL 
theory. (There was a year-long active hostility towards potentially 
simple things such as generics in the Go community. You can draw your 
own conclusions.)

>>> The use cases of DIP1035, for the most part, are a strict subset of 
>>> the uses of `__mutable`/`__metadata`.
>>
>> ???
> 
> All `__metadata` variables qualify as DIP1035 `@system`. If you added 
> `@system` to any instance of `__metadata`, it would have no effect.

Granted. Now you have shown "var is `__metadata`" => "var is `@system`", 
but that's not some sort of magical relationship between the qualifiers. 
There are multiple reasons why variables might by `@system` as it just 
collects every source of unsafety. `__metadata` is a new such source 
that we are considering adding to the language.

However, your claim above was the exact opposite: "var is @system" => 
"var is __metadata". As you said it is even a _strict subset_, you 
additionally claim that there are use cases where variables should be 
`__metadata` but not `@system`.

You seem to be contradicting yourself. It's either bad logic or bad 
communication.

> Therefore, if only `__metadata` were implemented, users could utilize it 
> to achieve the intended goals of DIP1035.

No, because DIP1035 does not alter variable types in any way. You could 
similarly say: "Just initialize your variables with unsafe values and 
get rid of the need for a `@system` annotation." This is however not a 
simplification. The compiler still needs to track all that and making it 
part of the notation makes it simpler to understand.

> (Just allow them to mark it 
> wherever they wanted instead of confining it to aggregate members, even 
> though most of the use cases are in fact aggregate members.)

This is not a complete specification...

> The question is simply whether additionally being able to violate the type 
> system would cause intractable problems.

No, not at all. Given that you apparently dismissed all the evidence in 
this thread as "tractable problems", your standard is way off in my 
opinion. E.g., I would similarly not run into _intractable_ problems if 
I chopped one of my arms off. That does not make it any less stupid even 
though one arm is clearly simpler than two arms. It would however not 
simplify my life.

You are basically stating that you will not move away from your 
position, no matter what. Digging in like that is not healthy, and this 
proposal is not actually worth spending time on, neither yours nor mine.

> I don't know. I suspect that 
> almost all use cases of `@system` are mutable to begin with. And if they 
> weren't, I would have to look the workarounds, to see if issues of 
> having undesired `__metadata` functionality caused more pain than the 
> simplicity of using only one keyword merited.
> ...

You keep claiming it's simpler. It's not. You are chasing after a prize 
that's not actually worth anything because you are using some useless, 
tunnel-vision notion of simplicity that only considers one (very 
unimportant) aspect of what potentially makes a language simple.

I would not chop off my arm even if someone offered to buy my house for 
one dollar in exchange, even though one dollar is a very simple amount. 
Avoiding that kind of "trade-off" should not be controversial.

>> So your proposal is...
> 
> My proposal is to take everything DIP1035 marks or infers as `@system` 
> and extend `__metadata` functionality to it.

I see, so if a module-scope variable is inferred `@system`, you will get 
an error because `__metadata` has been applied to a non-member variable. 
(I get that you state at other places you don't want it to work that 
way, but given that you seem to be unable to simply state what your 
proposal is, it's unlikely to actually be all that simple.)

> This may sound dangerous. 

Primarily it sounds utterly pointless. All the reasoning about why it's 
"dangerous" is only required because you refuse to accept that it's 
pointless.

> The logic is simply that this is `@system` code, and `@system` code is 
> dangerous.

Given your own standards of evidence, you will have to do much better 
than that. Please tell me how having separate `@system` and `__metadata` 
will cause intractable pain, suffering and ultimately end civilization 
as we know it. If you can't do that in a way that satisfies me, I will 
dismiss everything you say.

> But it is also powerful. That's the overarching idea. Both 
> dangerous and powerful. (D should also be working towards `@safe` by 
> default, of course.)
> 
> Again, the only question is whether having `__metadata` functionality 
> will cause intractable pain to the use cases of `@system` which don't 
> require it.
> ...

I really don't understand why you are willing to suffer everything short 
of "intractable pain" for this issue.

>> In any case, even if your proposal was simple to state formally, it 
>> would still lead to really bad outcomes.
> 
> The difference between us is that you are sure of that, and I am not.
> ...

I wouldn't say that's the whole difference.

> ...
> 
> The solution to our debate — insofar as my claims deserve any merit at 
> all — is to implement both DIP1035 and the `__metadata` DIP, with the 
> additional requirement that all uses of `__metadata` be marked `@system` 
> as well.

Not much point in that, it's just more line noise.

> Semantically, it would change nothing, and it would actually be 
> easier to understand for newcomers.
> ...

Newcomers will not have to learn about `__metadata` or `@system` 
variables for a pretty long time. Then they may come across `@system` 
variables at some point, and finally, some further minority of D 
programmers will actually need to significantly concern themselves with 
`__metadata` rules.

If you keep the qualifiers separate, the meaning of `@system` is simple 
and intuitive and nobody who would not otherwise need to will have to 
concern themselves with `__metadata`. That's a much better proposition 
for newcomers than arbitrary conflation.

> Then, five years later, to test my theory, add a compiler switch 
> `preview=deprecate__metadata`, put the `__metadata` functionality into 
> the `@system`, and make `__metadata` a no-op.
> 
> If nothing breaks, I was right. If something breaks, and the workarounds 
> aren't seamless, then you were right.
> 
...

In other words, you will just move the goalposts until you can claim you 
were right. Maybe you should care less about having been right in the 
past and more about being right in the future. Note that in my very 
first debate on this forum, I admitted that I had been wrong and that 
Andrei was right. For me, this is not about being right, it's about not 
having to go through the hassle of switching programming languages. I 
don't enjoy pointless debate, but weird language rules make it harder to 
justify why I am even using D. I need it to look like things are getting 
better (which generally they have been over the past 10 years), not worse.


More information about the Digitalmars-d mailing list