DIP 1024--Shared Atomics--Community Review Round 1

Ola Fosheim Grøstad ola.fosheim.grostad at gmail.com
Sun Oct 13 21:05:23 UTC 2019

On Sunday, 13 October 2019 at 19:23:45 UTC, Manu wrote:
> Your insistence that shared should be a library thing applies 
> equally
> to const. It behaves in an identical manner to const, and if 
> you can't
> make a compelling case for moving const to a library, you can't
> possibly sell me on that idea with respect to shared.

I'm not trying to sell anything, but you cannot easily implement 
D's const using metaprogramming as metaprogramming is realized in 

You can easily extend the metaprogramming capabilities of D to 
implement shared.

Apples and Oranges.

> 1. `shared` defines D's thread-local by default semantics... 
> without
> shared, there is no thread-local by default. That decision is 
> so deep,
> there is absolutely no way to move away from that.

That argument makes no sense to me. Thread local or not thread 
local is essentially only by social agreement if you have 
syntactical means to get around it.  It is predominantly a social 

It is a matter of agreement, interpretation, conceptualization, 
mindset... That is what defines what is thread local in D. Not 

That is not how it is in a type system that is stronger like in 
Pony. Where it is strictly enforced and clearly defined fully 
semantically in the machinery with no means to break the type 

In that regard, D is not much different from C++, it is 
predominantly social and syntactical. Except in D you might have 
stronger agreement, stronger social contract, more visible 
syntactical symbols. So it appears to be stronger.

But as long as D is going to interface tightly with C/C++ it will 
always rely on social contracts.

> 2. We must be able to overload on `shared`. We can't 'overload' 
> on
> template wrappers; we can try and specialise and stuff and abuse
> clever inference and type deduction, but things break down 
> quickly. I
> have tried to simulate type qualifiers with template wrappers 
> before.
> It always goes *very* badly, and it's a mess to work with.

You have two alternatives:

1.  you can do a simple one with template wrappers.

2. you can extend the meta programming capabilities and have a 
more advanced  solution that is more in line with the current 

But it certainly is possible, and not very hard to envision. 
After all making something completely unavailable, is much easier 
than only making some aspects of an object unavailable. Which is 
why "shared" is relatively easy to do on the syntactical level in 
D, but "const" is harder. If meta-programming in D was more 
deductive then const would be fair game too, but that is not the 
case, so... it becomes less obvious and probably not worth the 

> 3. Most importantly, there is a future (not shown in this 
> discussion)
> where shared should allow some implicit promotions safely; for
> instance:

Ok, not sure if that really impacts whether it can be done in a 
library or not, but it certainly is VERY important to list such 
use-cases with sufficient detail when designing foundational 
mechanisms that is supposed to enable good interfaces to 
parallell programming libraries!

More information about the Digitalmars-d mailing list