Re: DIP 1018--The Copy Constructor--Formal Review

2019-03-03 Thread Olivier FAURE via Digitalmars-d-announce
On Thursday, 28 February 2019 at 01:42:13 UTC, Andrei 
Alexandrescu wrote:
Such sharing of resources across objects is a common 
occurrence, which would be impeded by forcing `const` on the 
right-hand side of a copy. (An inferior workaround would be to 
selectively cast `const` away inside the copy constructor, 
which is obviously undesirable.) For that reason this DIP 
proposes allowing mutable copy sources.


There's an argument to be made that a copy constructor isn't the 
best way to share resources between two variables in a way that 
might affect code using the variable being copied.


Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-27 Thread Andrei Alexandrescu via Digitalmars-d-announce

On 02/25/2019 03:41 PM, Paolo Invernizzi wrote:

On Monday, 25 February 2019 at 20:23:58 UTC, Andrei Alexandrescu wrote:

On 2/25/19 3:23 PM, Jacob Carlborg wrote:

On 2019-02-25 20:24, Mike Parker wrote:


 From the process document:

“the DIP Manager or the Language Maintainers may allow for
exceptions which waive requirements or responsibilities at their
discretion.”


Having it documented doesn't make it less flawed.


Jacob, are there amends you need to make to the DIP?


Honestly, I've not understood the rationale or the covered use case in
letting the copy ctor mutate the ref source parameters...
Sincerely, without polemical intent.


I made an editorial pass:

https://github.com/dlang/DIPs/pull/145

The most material change was additional explanation of using mutable ref 
instead of e.g. const. Here's the relevant excerpt, please let me know 
if it clarifies the motivation.


=
1. The parameter of the copy constructor is passed by a mutable 
reference to the
source object. This means that a call to the copy constructor may 
legally modify

the source object:

```d
struct A
{
int[] a;
this(ref A another)
{
another.a[2] = 3;
}
}

void main()
{
A a, b;
a = b;// b.a[2] is modified
}
```

This is surprising and potentially error-prone behavior because changing 
the source of a copy is not customary and may surprise the user of a 
type. (For that reason, C++ coding standards adopt the convention of 
taking the source by means of reference to `const`; copy constructors 
that use non-`const` right-hand side are allowed but discouraged.) In D, 
`const` and `immutable` are more restrictive than in C++, so forcing 
`const` on the copy constructor's right-hand side would make simple 
copying task unduly difficult. Consider:


```d
class Window
{
...
}
struct Widget
{
private Window display;
...
this(ref const Widget rhs)
{
display = rhs.display; // Error! Cannot initialize a Window 
from a const(Window)

}
}
```

Such sharing of resources across objects is a common occurrence, which 
would be impeded by forcing `const` on the right-hand side of a copy. 
(An inferior workaround would be to selectively cast `const` away inside 
the copy constructor, which is obviously undesirable.) For that reason 
this DIP proposes allowing mutable copy sources.

=



Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-27 Thread Kagamin via Digitalmars-d-announce

On Tuesday, 26 February 2019 at 05:38:01 UTC, Manu wrote:
I'm talking about this DIP. Allowing a mutable copy argument 
feels super weird.


The problem was out of place mutation, which can't happen with 
copy constructor, because initialization from rvalue is a move, 
so the copy constructor won't be called.


Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-27 Thread Walter Bright via Digitalmars-d-announce

On 2/27/2019 3:27 AM, Jacob Carlborg wrote:

[...]


Please start another thread.


Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-27 Thread Jacob Carlborg via Digitalmars-d-announce

On 2019-02-26 12:07, Walter Bright wrote:

It hasn't been approved yet, and please start another thread if you want 
to discuss it.


You have approved the pull request.

--
/Jacob Carlborg


Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-26 Thread Atila Neves via Digitalmars-d-announce

On Tuesday, 26 February 2019 at 03:56:27 UTC, Walter Bright wrote:

On 2/25/2019 7:45 AM, Atila Neves wrote:
I have no idea what people are talking about when they mention 
on this forum that D's const is useless. Nearly every function 
parameter in my code is `in`. Nearly every variable 
declaration uses `const` instead of `auto`, the main exception 
being when a function is constructing a value to return. Most 
member functions I write are const or inout. I use const in D 
as I do in C++: pretty much everywhere. Nearly every single 
time a function parameter in my code isn't const is when it's 
an input range.


I'm going to make an educated guess that you're experienced at 
FP programming!


Indeed.

Functional is my default in any language. The good thing about D 
is I can get my hands dirty when needed as opposed to jumping 
through hoops or forcing me to use recursion when it doesn't fit 
the problem (hello C++ metaprogramming).


I'd love it if functions were `@safe` and `pure` by default.


Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-26 Thread Walter Bright via Digitalmars-d-announce

On 2/26/2019 2:32 AM, Jacob Carlborg wrote:

What about the __mutable proposal [1]?

[1] https://github.com/dlang/dmd/pull/8315



It hasn't been approved yet, and please start another thread if you want to 
discuss it.


Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-26 Thread Jacob Carlborg via Digitalmars-d-announce

On 2019-02-25 01:38, Walter Bright wrote:


D's const has teeth. Nothing can be modified through T.


What about the __mutable proposal [1]?

[1] https://github.com/dlang/dmd/pull/8315

--
/Jacob Carlborg


Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-26 Thread Jacob Carlborg via Digitalmars-d-announce

On 2019-02-25 21:23, Andrei Alexandrescu wrote:


Jacob, are there amends you need to make to the DIP?


No, I'm talking about the process in general.

--
/Jacob Carlborg


Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-26 Thread Greatsam4sure via Digitalmars-d-announce

On Monday, 25 February 2019 at 02:29:40 UTC, Manu wrote:
On Sun, Feb 24, 2019 at 4:25 PM Walter Bright via 
Digitalmars-d-announce  
wrote:


Thanks for letting me know you're abandoning the rvalue ref 
DIP.


It's not an "rvalue ref" DIP (which I think has confused a lot 
of

people), it's an rvalue *by-ref* DIP.
In my head, an "rvalue ref" DIP is something completely 
different,

useful for implementing move semantics of mismatching types.

Are you talking about my DIP or that other thing?


I had held off
working on it because I didn't want to duplicate efforts; 
we're short-staffed

enough as it is.


'abandoning's a strong word, but I don't have motivation to 
work on it right now. Please, be my guest!


The worth of man is not measure by where he stand when all things 
are going well but where he stands in the time of face of 
challenge.


Your dip has face significant challenge. It is just a test on 
your ability to forge ahead and get what you believe done in the 
face of challenges.


I will really have problem in taking you serious if you just 
abandon the dip. Pls rewrite the dip and let it be 50-50% win for 
all of us




Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-26 Thread RazvanN via Digitalmars-d-announce

On Sunday, 24 February 2019 at 10:46:37 UTC, Mike Parker wrote:
Walter and Andrei have requested the Final Review round be 
dropped for DIP 1018, "The Copy Constructor", and have given it 
their formal approval. They consider copy constructors a 
critical feature for the language.


Walter provided feedback on Razvan's implementation. When it 
reached a state with which he was satisfied, he gave the green 
light for acceptance.


The DIP:
https://github.com/dlang/DIPs/blob/master/DIPs/accepted/DIP1018.md


The implementation:
https://github.com/dlang/dmd/pull/8688


Are there any other concerns regarding the copy constructor DIP? 
Although the debate about the value of const's transitivity is an 
interesting one, it is orthogonal to this proposal.


Regarding the mutability of the copy constructor source: it is 
not mandatory that the source is mutable; you can define it as 
const, it's just that it is not going to work with mutable 
objects that contain indirections. There is no workaround for 
this, and per the current language rules this is not a problem.


As for the *by ref* rvalue DIP, I suggest that the discussion 
should be moved in an other forum thread, as the discussion is 
hijacked from getting feedback for DIP 1018


Cheers,
RazvanN


Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-25 Thread Nicholas Wilson via Digitalmars-d-announce
On Tuesday, 26 February 2019 at 02:51:54 UTC, Andrei Alexandrescu 
wrote:

On 2/25/19 7:23 PM, Nicholas Wilson wrote:
I've said before that that comparison is weak and not 
particularly useful, irrespective of  its intention.


That you've said it before does not make it any more correct.


You're right that is does't change the facts, thats why it is an 
opinion. The resemblance, if any, it bears to the processes you 
describe is completely beside the actual point: namely that it is 
not _useful_.


There are differences, too, of which the public discussions in 
this forum is the main one.


Yes, thats why I think the journal submission metaphor is not apt.

This is in danger of getting abused; open discussions around 
DIPs in this forum give the false impression that DIP authors 
have the authority to demand any extent of explanation and 
justification of a decision.


Quoting myself from above:
On the contrary, if we believe your reasoning to be unsound or 
misguided
(irrespective of who is at fault) then clarification and 
resolution are the only appropriate courses of action.


If you believe that constitutes abuse, I really don't know what 
to say.


We do not have the capacity to do that, and it would not be 
anymore appropriate than journal reviewers being required to 
provide detailed feedback to submitters' satisfaction.


I sincerely hope you don't lack the capacity, else why are you 
reviewing it in the first place? Time or bandwidth, sure, thats 
what DConf Foundation meeting is for (among many other things).


This whole notion of a meeting whereby Walter is grilled by a 
committee on why exactly he rejected DIP 1016 is Kafkaesque.


Indeed, that would serve no purpose. What I want from such a 
meeting is:
1) an outline of requested changes that accurately reflects the 
sentiments of the DIP. I am fully aware the DIP underspecified 
and omitted some key aspects and that there were some ambiguities 
present. You have provided some in that link, thank you. Although 
I note that some of the advice is outdated/wrong. All this back 
and forth cements my growing suspicion that the forum is not an 
appropriate place for such discussions, it severely lacks 
bandwidth and reciprocal latency.


2) changes to the DIP process, i.e. what to do in the event of 
DIP breaking behaviour/ambiguities discovered post final review, 
so that these misunderstandings do not happen again.


You can count on me to massage the bureaucracy out of the 
process if that's the bottleneck.


Good, but this one is stuck until DConf, the forum (as a place of 
communication) lacks the bandwidth for this.


The most significant bit is to focus on working together toward 
making the proposal better, as opposed to focusing on 
negotiating acceptance.


YES! Thats what we've been trying to do! How ever, we can't do 
that if the criticisms do not reflect reality (lowering to 
statements, which was given as an example in the DIP and wrongly 
characterised in the formal assessment) and the ones that are 
legitimate criticisms are scattered about the forum. Hence why we 
want the official reasons for rejection at the bottom of the DIP 
to be updated to reflect that.


But whether the DIP keeps the number or gets another one, if 
the revised document is a 95% cut and paste of the existing 
one, the review is liable to be a 95% cut and paste of the 
existing one.


You, of all people, should know that a proposal is not a linear 
function of its text.

I _sincerely_ hope that your reviews aren't.



Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-25 Thread Manu via Digitalmars-d-announce
On Mon, Feb 25, 2019 at 9:30 PM Walter Bright via
Digitalmars-d-announce  wrote:
>
> On 2/25/2019 7:17 PM, Manu wrote:
> > break my DIP
>
> The review process is not about "why not add this feature" , but "why should 
> we
> have this feature".
>
> Additionally, it is most assuredly about finding flaws in it. Isn't it best to
> find out the flaws before going further with it than finding them in the 
> field?
>
> As I mentioned before, it's supposed to be brutal. Any
> testing/certification/review process is about trying to break it.
>
> It has (hopefully) nothing to do with how hard (or little) you worked on it, 
> nor
> the cut of your jib, nor acceptance (or not) of mediocrity/merit in other 
> DIPs.

I'm talking about this DIP. Allowing a mutable copy argument feels super weird.
The reasons are clear, but that doesn't make it feel less weird.
I feel like the problem is with const, not with this DIP, but I'm not
about to convince anybody, so we're all good here.


Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-25 Thread Walter Bright via Digitalmars-d-announce

On 2/25/2019 7:17 PM, Manu wrote:

break my DIP


The review process is not about "why not add this feature" , but "why should we 
have this feature".


Additionally, it is most assuredly about finding flaws in it. Isn't it best to 
find out the flaws before going further with it than finding them in the field?


As I mentioned before, it's supposed to be brutal. Any 
testing/certification/review process is about trying to break it.


It has (hopefully) nothing to do with how hard (or little) you worked on it, nor 
the cut of your jib, nor acceptance (or not) of mediocrity/merit in other DIPs.


Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-25 Thread Walter Bright via Digitalmars-d-announce

On 2/25/2019 7:17 PM, Manu wrote:

I'm literally astonished that it's been agreed it's fine that
a copy constructor can mutate the source... and I can't help but draw
contrast to the exact same sorts of arguments that people were using
to break my DIP,


Mutating the lvalue ref was not the issue, as I recall. It was conversion of the 
value to a temporary of a different type, then modifying the temporary, not the 
original.


https://digitalmars.com/d/archives/digitalmars/D/announce/DIP_1016--ref_T_accepts_r-values--Formal_Assessment_54145.html#N54345

It is not analogous to the mutable cpctor argument case, because there is no 
hidden conversion to a temporary.


Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-25 Thread Donald via Digitalmars-d-announce

On Tuesday, 26 February 2019 at 03:17:53 UTC, Manu wrote:

...


It's funny that you keep wasting time posting/replying instead of 
fixing your DIP.


By the way like the other guy, I found disrespectful (With 
RazvanN7) use this topic as argument for your rejected DIP, 
instead to debate about what this one has to offer.


Donald.


Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-25 Thread Walter Bright via Digitalmars-d-announce

On 2/25/2019 3:05 PM, Olivier FAURE wrote:

On Monday, 25 February 2019 at 22:45:38 UTC, Olivier FAURE wrote:

For the same reason C++'s std::shared_pointer uses a non-const copy constructor.


Wait, no, I just checked, std::shared_pointer's copy constructor is const, even 
though it changes shared data. Ugh, that's just wrong.


(I kind of agree with Walter's point; I totally assumed the constructor would be 
non-const, since it mutates data it receives)


There's also no requirement that any arguments to constructors should be const. 
Why should copy-constructors be different?


Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-25 Thread Walter Bright via Digitalmars-d-announce

On 2/25/2019 10:44 AM, Andrei Alexandrescu wrote:

On 2/25/19 1:39 PM, Jacob Carlborg wrote:

On 2019-02-25 17:31, Andrei Alexandrescu wrote:

The proposers (Razvan and myself) and Walter (the reviewer) do not know how 
to make DIP 1018 better.


That shouldn't justify accepting a DIP that might contain problems.


Definitely.


But of course, if you don't think there are any problems.


Not talking for Walter, but generally acceptance implies that.


I can't guarantee there aren't problems (bugs) in the DIP, but I didn't find any 
more (the ones I did find Razvan fixed). If you're familiar with the C++ copy 
ctor, it is very similar, lending credence to the notion that there isn't a big 
problem left.


Regardless, we need to move forward with this, not wring hands wondering what 
to do.


Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-25 Thread Walter Bright via Digitalmars-d-announce

On 2/25/2019 6:55 PM, Andrei Alexandrescu wrote:

If there's something else I can do to atone, please let me know.


Pistols at dawn?

Or better yet, why don't I buy both of you a beer at DConf?



Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-25 Thread Walter Bright via Digitalmars-d-announce

On 2/25/2019 8:22 AM, H. S. Teoh wrote:

I disagree.  Logical const means the outside world can't tell that the
object has changed, because only a constant value is ever seen from
outside.  This is the basis of lazy initialization (which is part of the
concept of lazy evaluation), an important feature of FP style code, and
something that D does not support.


We've been through the logical const discussion before. The problem with it is 
it is not machine checkable. Therefore it's a documentation thing, not a 
language thing.


The not-machine-checkable attributes should be in the domain of user-defined 
attributes. It's what they're for.




A derived problem with D's const is the inability to express a cached
const object.  You can't cache the object because it's const, which
greatly limits the scope of usability of const in large data structures.


I'd like to draw a distinction between where one can USE const as apposed to 
where const has VALUE. I propose that weakening const so it can be used on data 
that is mutated anyway means it can be put to USE much more often, at a heavy 
price of a severely diminished VALUE. It's why I pressed Manu about the VALUE of 
head const.




The same limitation makes ref-counting such a huge challenge to
implement in D.  There is simply no way to associate a refcount with a
const object without jumping through hoops and/or treading into UB
territory by casting away const. There is no way to express that the
refcount is mutable but the rest of the object isn't. Well, you *can*
express this if you use circumlocutions like:

struct RefCounted(T) {
int refcount;
const(T) payload;
}

but that's worthless in generic code because const(RefCounted!T) !=
RefCounted!(const T). So you have to special-case every generic function
that needs to work with this type, and the special cases percolate
through the entire codebase, uglifying the code and forcing generic
functions that shouldn't need to know about RefCounted to have to know
about it so that they can work with it.


We're well aware of that issue. The lack of copy-constructors was the first big 
barrier to getting ref counting working properly.




Because of these limitations, const is really only useful in low-level
modules of limited scope, in simple, self-contained data structures.
Higher-level, larger data structures are basically unusable with D's
const because lazy initialization and caching are not possible without
treading into UB territory by casting.  I'm not going to argue that
C++'s version of const is any better -- because non-enforceable const is
worthless, like you said -- but let's not kid ourselves that D's const
is that much better.  D's const is really only usable in very limited
situations, and there are many things for which it's unusable even
though logically it *could* have been applicable.


We'll see. I've been slowly getting better at refactoring code so I can use 
const, and as I've recounted before, the results are quite pleasing.




Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-25 Thread Walter Bright via Digitalmars-d-announce

On 2/25/2019 7:45 AM, Atila Neves wrote:
I have no idea what people are talking about when they mention on this forum 
that D's const is useless. Nearly every function parameter in my code is `in`. 
Nearly every variable declaration uses `const` instead of `auto`, the main 
exception being when a function is constructing a value to return. Most member 
functions I write are const or inout. I use const in D as I do in C++: pretty 
much everywhere. Nearly every single time a function parameter in my code isn't 
const is when it's an input range.


I'm going to make an educated guess that you're experienced at FP programming!


Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-25 Thread Walter Bright via Digitalmars-d-announce

On 2/25/2019 3:09 PM, Olivier FAURE wrote:
Yes, this DIP was fast-tracked. Yes, this can feel unfair. And yet, it makes 
sense that it was fast-tracked, because it fits a priority of the project owners 
(C++ interoperability + reference counting) and project owners are allowed to 
have priorities. It's not like this DIP was rushed or has major vulnerabilities 
(the "mutable copy constructor" thing is necessary for reference counting).


And yes, it underwent major rewrites as Razvan can confirm :-)


Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-25 Thread Walter Bright via Digitalmars-d-announce

On 2/25/2019 6:26 PM, Andrei Alexandrescu wrote:
I haven't heard the final decision from Walter yet, but I proposed that in the 
interest of quality, we will go through the customary two weeks reviews with DIP 
1018.


I approved it.


Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-25 Thread Manu via Digitalmars-d-announce
On Mon, Feb 25, 2019 at 3:10 PM Olivier FAURE via
Digitalmars-d-announce  wrote:
>
> On Monday, 25 February 2019 at 16:00:54 UTC, Andrei Alexandrescu
> wrote:
> > Thorough feedback has been given, likely more so than for any
> > other submission. A summary for the recommended steps to take
> > can be found here:
> >
> > https://forum.dlang.org/post/q2u429$1cmg$1...@digitalmars.com
> >
> > It is not desirable to demand reviewers to do more work on the
> > review or to defend it. Acceptance by bullying is unlikely to
> > create good results. The target of work is squarely the
> > proposal itself.
>
> Agreed.
>
> Honestly, I am not impressed with the behavior of several members
> here.
>
> I understand that the rvalue DIP went through a long process,
> that some people really wanted it to be accepted, and that it was
> frustrating to wait so long only for it to be refused, but at
> some point, you guys have to accept that the people in charge
> refused it.

No, you've missed the point **completely**.
I'm not even remotely surprised it was rejected, I never imagined that
I'd change peoples minds on this after trying to do so for 10 years
running.

> They explained why they did, their reasons matched
> concerns other users had, and they explained how to move the
> proposal forward.

This sentence couldn't be more wrong.

I'm going to write this again because you prompted me to, I've said it
elsewhere lots, but apparently you've missed it;
What pissed me off was that the rejection text was almost completely
wrong, it almost felt like they just skimmed it and made up details
according to presumption, and then when I raised the topic on what was
actually wrong looking for actionable feedback, it was made clear that
it was not open to amendment, I *must* write a whole new DIP and
completely reboot the process because all the text was rubbish, and I
should employ someone else competent to do it with me. Then I was
insulted a couple more times; it was implied that the DIP was so bad I
didn't even understand the implications of my own text (I did), and
that it had holes large enough to drive a truck through (it
doesn't)... and only then after a few cycles of referring to the
*actual* text that was written, it was conceded that those criticisms
were indeed incorrect, and then we were able to arrive at some useful
feedback, all of which is of trivial-amendment magnitude; fix the
rewrite to address exceptions, and add some additional text to clarify
a point of misunderstanding that I thought I couldn't have made more
clear if I tried.
Even at the tail end of that though, the result remained the same:
rewrite the DIP, reboot the process, another few hundred days later...
it was expressly rejected that an amendment would be accepted for
consideration, despite agreeing at the end of the thread that that's
all that's required to address the *true* criticisms.

That was a worthless experience, and it didn't help anyone.

> So again, I get that this is frustrating, but repeatedly
> complaining and asking for an appeal and protesting about other
> DIPs being accepted is *not* professional behavior.

I'm not a bloody professional, I'm a volunteer!
I do think it would have been useful to amend the rejection text to be
true at the very least, and match the proposal that is written.
I held that position before the thread had played out to where useful
action points emerged, simply because I wanted to have any idea how to
move forward. At the conclusion of that thread, we have the data, and
I don't care, although still no path to have it reconsidered with
amendments, and I'm not gonna take a few hundred more days to start
over.

The reason I bring it up here is not that I'm salty (I am), but
because I'm literally astonished that it's been agreed it's fine that
a copy constructor can mutate the source... and I can't help but draw
contrast to the exact same sorts of arguments that people were using
to break my DIP, and countless other proposals that I've seen over the
years. My DIP was just one of very very many instances of where this
class of issue (unexpected mutation of caller-owned data) would be
used to destroy something, but we're accepting it here at a very
fundamental level of the language.
I just can't see how it's fine in this case, after being show-stopping
for as long as I've been watching.

And to circle right back to the start; I suspect the only reason that
it's considered acceptable here, is that this is an issue of extremely
high importance, and nobody has any better ideas.
To repeat my comment; the problem as I see it, is that `const` as
defined is extremely problematic, and rather than address that hard
issue, we'll just make a compromise in this case.

Anyway, I actually support this DIP, I'm for practical solutions to
problems... the only point I was trying to make at the start of this
thread is that this sets a precedent, which if we're fair, requires a
re-examination of so many rejected ideas gone by.


Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-25 Thread Andrei Alexandrescu via Digitalmars-d-announce

On 2/25/19 9:26 PM, Manu wrote:

On Mon, Feb 25, 2019 at 12:20 PM Andrei Alexandrescu via
Digitalmars-d-announce  wrote:


On 2/25/19 2:41 PM, bachmeier wrote:

On Monday, 25 February 2019 at 19:24:55 UTC, Mike Parker wrote:


 From the process document:

“the DIP Manager or the Language Maintainers may allow for exceptions
which waive requirements or responsibilities at their discretion.”

If you were to write a DIP for a feature they think important enough,
it could be fast tracked, too.


I hate to be so negative, but when I see D's corporate management
structure, the lack of community contribution is obvious. It doesn't
exactly motivate contributions. This is no way to run an open source
project. I understand that it works well for Facebook because everyone
on the team is paid six figures, and they can be replaced in two hours,
but an open source project is not Facebook.

I know the whole argument about why it is that way. That doesn't mean
it's going to work.


What do you recommend? Should we carry a final review here?


In my case, you could have produced useful and not-completely-wrong
rejection text with the rejection, and then not insulted me a few
times before eventually producing some actionable feedback.
I mean, its in your interest to foster contribution, not repel it.


I apologize again for my use of unkind words. If there's something else 
I can do to atone, please let me know.


Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-25 Thread Andrei Alexandrescu via Digitalmars-d-announce

On 2/25/19 7:23 PM, Nicholas Wilson wrote:
There are similarities and differences between our DIP process and 
paper submission reviews at conferences and journals everywhere; one 
key similarity is that the submitters are on hook for providing 
convincing submissions, whereas reviewers are not required to defend 
their reviews. It's an asymmetric relationship that occasionally 
frustrates, but it is as such for good reason and it works.


I've said before that that comparison is weak and not particularly 
useful, irrespective of  its intention.


That you've said it before does not make it any more correct. We have 
intently modeled the acceptance process after that used by the review 
process used by conferences, journals, and standardization committees - 
naturally from the communities I have some familiarity with (Programming 
Languages, Machine Learning, Natural Language Processing, Algorithms, 
ISO C++). So the alleged similarities are more of a statement of fact 
than a metaphor.


There are differences, too, of which the public discussions in this 
forum is the main one. This is in danger of getting abused; open 
discussions around DIPs in this forum give the false impression that DIP 
authors have the authority to demand any extent of explanation and 
justification of a decision. We do not have the capacity to do that, and 
it would not be anymore appropriate than journal reviewers being 
required to provide detailed feedback to submitters' satisfaction. This 
whole notion of a meeting whereby Walter is grilled by a committee on 
why exactly he rejected DIP 1016 is Kafkaesque.


The keyword here is "short". By suggesting that the action required is 
to rewrite, the order is most definitely not short. Time is a valuable 
resource, and a new DIP from scratch through the DIP process takes a lot 
of it.


You can count on me to massage the bureaucracy out of the process if 
that's the bottleneck. The most significant bit is to focus on working 
together toward making the proposal better, as opposed to focusing on 
negotiating acceptance. But whether the DIP keeps the number or gets 
another one, if the revised document is a 95% cut and paste of the 
existing one, the review is liable to be a 95% cut and paste of the 
existing one.


Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-25 Thread Andrei Alexandrescu via Digitalmars-d-announce

On 2/25/19 6:09 PM, Olivier FAURE wrote:
Yes, this DIP was fast-tracked. Yes, this can feel unfair. And yet, it 
makes sense that it was fast-tracked, because it fits a priority of the 
project owners (C++ interoperability + reference counting) and project 
owners are allowed to have priorities. It's not like this DIP was rushed 
or has major vulnerabilities (the "mutable copy constructor" thing is 
necessary for reference counting).


I haven't heard the final decision from Walter yet, but I proposed that 
in the interest of quality, we will go through the customary two weeks 
reviews with DIP 1018.


Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-25 Thread Manu via Digitalmars-d-announce
On Mon, Feb 25, 2019 at 12:20 PM Andrei Alexandrescu via
Digitalmars-d-announce  wrote:
>
> On 2/25/19 2:41 PM, bachmeier wrote:
> > On Monday, 25 February 2019 at 19:24:55 UTC, Mike Parker wrote:
> >
> >> From the process document:
> >>
> >> “the DIP Manager or the Language Maintainers may allow for exceptions
> >> which waive requirements or responsibilities at their discretion.”
> >>
> >> If you were to write a DIP for a feature they think important enough,
> >> it could be fast tracked, too.
> >
> > I hate to be so negative, but when I see D's corporate management
> > structure, the lack of community contribution is obvious. It doesn't
> > exactly motivate contributions. This is no way to run an open source
> > project. I understand that it works well for Facebook because everyone
> > on the team is paid six figures, and they can be replaced in two hours,
> > but an open source project is not Facebook.
> >
> > I know the whole argument about why it is that way. That doesn't mean
> > it's going to work.
>
> What do you recommend? Should we carry a final review here?

In my case, you could have produced useful and not-completely-wrong
rejection text with the rejection, and then not insulted me a few
times before eventually producing some actionable feedback.
I mean, its in your interest to foster contribution, not repel it.



Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-25 Thread Nicholas Wilson via Digitalmars-d-announce
On Tuesday, 26 February 2019 at 00:23:19 UTC, Nicholas Wilson 
wrote:
On Monday, 25 February 2019 at 16:00:54 UTC, Andrei 
Alexandrescu wrote:

* etc. etc. etc.


That is a good start, though I suspect that the list is not 
complete given the last item.


Oh, it keeps going.


Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-25 Thread Nicholas Wilson via Digitalmars-d-announce
On Monday, 25 February 2019 at 20:23:58 UTC, Andrei Alexandrescu 
wrote:

On 2/25/19 3:23 PM, Jacob Carlborg wrote:

On 2019-02-25 20:24, Mike Parker wrote:


 From the process document:

“the DIP Manager or the Language Maintainers may allow for 
exceptions which waive requirements or responsibilities at 
their discretion.”


Having it documented doesn't make it less flawed.


Jacob, are there amends you need to make to the DIP?


This whole reply chain sounds more like the problems lie with the 
DIP process not this DIP, but  I'll let Jacob answer that.


Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-25 Thread Nicholas Wilson via Digitalmars-d-announce
On Monday, 25 February 2019 at 16:00:54 UTC, Andrei Alexandrescu 
wrote:

On 2/25/19 1:06 AM, Nicholas Wilson wrote:
On Monday, 25 February 2019 at 02:56:13 UTC, Walter Bright 
wrote:
Your DIP, and nobody else is going to do it, so it falls to 
me.


It will be reviewed at Dconf, please make sure you have an 
_accurate_ summary of your criticisms of the DIP ready for 
then.


This seems to be a misunderstanding of protocol. A negative 
review is simply a signal that the submission has not been 
strong enough. As such, the submission, not the review, needs 
to be improved.


I'm not suggesting that the DIP is perfect, nor that it was 
without ambiguities and misunderstandings, nor that is 
can't/doesn't need to be improved.
What _is_ important is that the time spent on improving it 
covered that areas that actually need improvement, and given the 
misunderstandings on all sides, a useful starting point is the 
set of problems the reviewers have identified crosschecked by the 
authors. That is not an unreasonable request.


There are similarities and differences between our DIP process 
and paper submission reviews at conferences and journals 
everywhere; one key similarity is that the submitters are on 
hook for providing convincing submissions, whereas reviewers 
are not required to defend their reviews. It's an asymmetric 
relationship that occasionally frustrates, but it is as such 
for good reason and it works.


I've said before that that comparison is weak and not 
particularly useful, irrespective of  its intention.


It is not a matter of misunderstanding 1-2 sentences, but a 
problem of precision in specification that needs to be 
approached with due care.


I believe it is both, which is the basis for the opinion that 
resubmission is not the appropriate course of action to make best 
use of everyone's time.


* Description of the typechecking process, with examples of 
code that passes and code that fails;


* A clarification that lowering proceeds not against all 
expressions, but only against rvalues;


* Several places in text in which it is explained that rvalues 
resulted from implicit conversions are not eligible;


* etc. etc. etc.


That is a good start, though I suspect that the list is not 
complete given the last item.


It is not desirable to demand reviewers to do more work on the 
review or to defend it.


On the contrary, if we believe your reasoning to be unsound or 
misguided (irrespective of who is at fault) then clarification 
and resolution are the only appropriate courses of action.



Acceptance by bullying is unlikely to create good results.


I agree, but that has not happened here.


The target of work is squarely the proposal itself.

Our understanding after Manu asked for action items was that he 
would be up for the work in short order.


The keyword here is "short". By suggesting that the action 
required is to rewrite, the order is most definitely not short. 
Time is a valuable resource, and a new DIP from scratch through 
the DIP process takes a lot of it.




Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-25 Thread Jonathan M Davis via Digitalmars-d-announce
On Monday, February 25, 2019 4:09:55 PM MST Olivier FAURE via Digitalmars-d-
announce wrote:
> Yes, this DIP was fast-tracked. Yes, this can feel unfair. And
> yet, it makes sense that it was fast-tracked, because it fits a
> priority of the project owners (C++ interoperability + reference
> counting) and project owners are allowed to have priorities. It's
> not like this DIP was rushed or has major vulnerabilities (the
> "mutable copy constructor" thing is necessary for reference
> counting).

It's worth noting that the copy constructor DIP went through a _lot_ of
discussion and was revised accordingly. So, while Walter and Andrei may have
considered it a priority, it still took a while for it to get to the point
that it was acceptable.

- Jonathan M Davis





Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-25 Thread Olivier FAURE via Digitalmars-d-announce

On Monday, 25 February 2019 at 22:45:38 UTC, Olivier FAURE wrote:
For the same reason C++'s std::shared_pointer uses a non-const 
copy constructor.


Wait, no, I just checked, std::shared_pointer's copy constructor 
is const, even though it changes shared data. Ugh, that's just 
wrong.


(I kind of agree with Walter's point; I totally assumed the 
constructor would be non-const, since it mutates data it receives)


Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-25 Thread Olivier FAURE via Digitalmars-d-announce
On Monday, 25 February 2019 at 16:00:54 UTC, Andrei Alexandrescu 
wrote:
Thorough feedback has been given, likely more so than for any 
other submission. A summary for the recommended steps to take 
can be found here:


https://forum.dlang.org/post/q2u429$1cmg$1...@digitalmars.com

It is not desirable to demand reviewers to do more work on the 
review or to defend it. Acceptance by bullying is unlikely to 
create good results. The target of work is squarely the 
proposal itself.


Agreed.

Honestly, I am not impressed with the behavior of several members 
here.


I understand that the rvalue DIP went through a long process, 
that some people really wanted it to be accepted, and that it was 
frustrating to wait so long only for it to be refused, but at 
some point, you guys have to accept that the people in charge 
refused it. They explained why they did, their reasons matched 
concerns other users had, and they explained how to move the 
proposal forward.


So again, I get that this is frustrating, but repeatedly 
complaining and asking for an appeal and protesting about other 
DIPs being accepted is *not* professional behavior. Reviewers are 
entitled to refuse contributions for any reasons, and if a 
reviewer rejects a proposal, too bad; you don't get to ask again 
and again and complain and bring it up in every other thread 
until they say yes.


Yes, this DIP was fast-tracked. Yes, this can feel unfair. And 
yet, it makes sense that it was fast-tracked, because it fits a 
priority of the project owners (C++ interoperability + reference 
counting) and project owners are allowed to have priorities. It's 
not like this DIP was rushed or has major vulnerabilities (the 
"mutable copy constructor" thing is necessary for reference 
counting).


Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-25 Thread Olivier FAURE via Digitalmars-d-announce
On Monday, 25 February 2019 at 20:41:58 UTC, Paolo Invernizzi 
wrote:
Honestly, I've not understood the rationale or the covered use 
case in letting the copy ctor mutate the ref source 
parameters...

Sincerely, without polemical intent.

- P


For the same reason C++'s std::shared_pointer uses a non-const 
copy constructor.


Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-25 Thread Paul Backus via Digitalmars-d-announce
On Monday, 25 February 2019 at 20:41:58 UTC, Paolo Invernizzi 
wrote:
Honestly, I've not understood the rationale or the covered use 
case in letting the copy ctor mutate the ref source 
parameters...

Sincerely, without polemical intent.

- P


Because D's const is transitive, you can't copy-construct a 
mutable object from a const source:


struct S
{
int[] stuff;
this(const ref S source) {
stuff = source.stuff; // Error: can't assign const(int[]) 
to int[]

}
}


Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-25 Thread Andrei Alexandrescu via Digitalmars-d-announce

On 2/25/19 3:41 PM, Paolo Invernizzi wrote:

On Monday, 25 February 2019 at 20:23:58 UTC, Andrei Alexandrescu wrote:

On 2/25/19 3:23 PM, Jacob Carlborg wrote:

On 2019-02-25 20:24, Mike Parker wrote:


 From the process document:

“the DIP Manager or the Language Maintainers may allow for 
exceptions which waive requirements or responsibilities at their 
discretion.”


Having it documented doesn't make it less flawed.


Jacob, are there amends you need to make to the DIP?


Honestly, I've not understood the rationale or the covered use case in 
letting the copy ctor mutate the ref source parameters...

Sincerely, without polemical intent.


We'll look into clarifying that better, thanks.



Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-25 Thread Paolo Invernizzi via Digitalmars-d-announce
On Monday, 25 February 2019 at 20:23:58 UTC, Andrei Alexandrescu 
wrote:

On 2/25/19 3:23 PM, Jacob Carlborg wrote:

On 2019-02-25 20:24, Mike Parker wrote:


 From the process document:

“the DIP Manager or the Language Maintainers may allow for 
exceptions which waive requirements or responsibilities at 
their discretion.”


Having it documented doesn't make it less flawed.


Jacob, are there amends you need to make to the DIP?


Honestly, I've not understood the rationale or the covered use 
case in letting the copy ctor mutate the ref source parameters...

Sincerely, without polemical intent.

- P


Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-25 Thread Jacob Carlborg via Digitalmars-d-announce

On 2019-02-25 20:24, Mike Parker wrote:


 From the process document:

“the DIP Manager or the Language Maintainers may allow for exceptions 
which waive requirements or responsibilities at their discretion.”


Having it documented doesn't make it less flawed.

--
/Jacob Carlborg


Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-25 Thread Andrei Alexandrescu via Digitalmars-d-announce

On 2/25/19 3:23 PM, Jacob Carlborg wrote:

On 2019-02-25 20:24, Mike Parker wrote:


 From the process document:

“the DIP Manager or the Language Maintainers may allow for exceptions 
which waive requirements or responsibilities at their discretion.”


Having it documented doesn't make it less flawed.


Jacob, are there amends you need to make to the DIP?



Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-25 Thread Andrei Alexandrescu via Digitalmars-d-announce

On 2/25/19 2:41 PM, bachmeier wrote:

On Monday, 25 February 2019 at 19:24:55 UTC, Mike Parker wrote:


From the process document:

“the DIP Manager or the Language Maintainers may allow for exceptions 
which waive requirements or responsibilities at their discretion.”


If you were to write a DIP for a feature they think important enough, 
it could be fast tracked, too.


I hate to be so negative, but when I see D's corporate management 
structure, the lack of community contribution is obvious. It doesn't 
exactly motivate contributions. This is no way to run an open source 
project. I understand that it works well for Facebook because everyone 
on the team is paid six figures, and they can be replaced in two hours, 
but an open source project is not Facebook.


I know the whole argument about why it is that way. That doesn't mean 
it's going to work.


What do you recommend? Should we carry a final review here?


Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-25 Thread bachmeier via Digitalmars-d-announce

On Monday, 25 February 2019 at 19:24:55 UTC, Mike Parker wrote:


From the process document:

“the DIP Manager or the Language Maintainers may allow for 
exceptions which waive requirements or responsibilities at 
their discretion.”


If you were to write a DIP for a feature they think important 
enough, it could be fast tracked, too.


I hate to be so negative, but when I see D's corporate management 
structure, the lack of community contribution is obvious. It 
doesn't exactly motivate contributions. This is no way to run an 
open source project. I understand that it works well for Facebook 
because everyone on the team is paid six figures, and they can be 
replaced in two hours, but an open source project is not Facebook.


I know the whole argument about why it is that way. That doesn't 
mean it's going to work.


Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-25 Thread Andrei Alexandrescu via Digitalmars-d-announce

On 2/25/19 2:24 PM, Mike Parker wrote:

On Monday, 25 February 2019 at 18:51:17 UTC, Jacob Carlborg wrote:

On 2019-02-24 11:46, Mike Parker wrote:
Walter and Andrei have requested the Final Review round be dropped 
for DIP 1018, "The Copy Constructor", and have given it their formal 
approval. They consider copy constructors a critical feature for the 
language.


Walter provided feedback on Razvan's implementation. When it reached 
a state with which he was satisfied, he gave the green light for 
acceptance.


I think the process is flawed when not everyone plays by the same rules.


 From the process document:

“the DIP Manager or the Language Maintainers may allow for exceptions 
which waive requirements or responsibilities at their discretion.”


If you were to write a DIP for a feature they think important enough, it 
could be fast tracked, too.


Thanks, Mike. We were a bit surprised ourselves by the scarce response 
during the community review stage. That said, Jacob and others, if there 
is a case for the final review please let us know.


Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-25 Thread Mike Parker via Digitalmars-d-announce

On Monday, 25 February 2019 at 18:51:17 UTC, Jacob Carlborg wrote:

On 2019-02-24 11:46, Mike Parker wrote:
Walter and Andrei have requested the Final Review round be 
dropped for DIP 1018, "The Copy Constructor", and have given 
it their formal approval. They consider copy constructors a 
critical feature for the language.


Walter provided feedback on Razvan's implementation. When it 
reached a state with which he was satisfied, he gave the green 
light for acceptance.


I think the process is flawed when not everyone plays by the 
same rules.


From the process document:

“the DIP Manager or the Language Maintainers may allow for 
exceptions which waive requirements or responsibilities at their 
discretion.”


If you were to write a DIP for a feature they think important 
enough, it could be fast tracked, too.




Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-25 Thread Jacob Carlborg via Digitalmars-d-announce

On 2019-02-24 11:46, Mike Parker wrote:
Walter and Andrei have requested the Final Review round be dropped for 
DIP 1018, "The Copy Constructor", and have given it their formal 
approval. They consider copy constructors a critical feature for the 
language.


Walter provided feedback on Razvan's implementation. When it reached a 
state with which he was satisfied, he gave the green light for acceptance.


I think the process is flawed when not everyone plays by the same rules.

--
/Jacob Carlborg


Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-25 Thread Andrei Alexandrescu via Digitalmars-d-announce

On 2/25/19 1:39 PM, Jacob Carlborg wrote:

On 2019-02-25 17:31, Andrei Alexandrescu wrote:

The proposers (Razvan and myself) and Walter (the reviewer) do not 
know how to make DIP 1018 better.


That shouldn't justify accepting a DIP that might contain problems.


Definitely.


But of course, if you don't think there are any problems.


Not talking for Walter, but generally acceptance implies that.


Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-25 Thread Jacob Carlborg via Digitalmars-d-announce

On 2019-02-25 17:31, Andrei Alexandrescu wrote:

The proposers (Razvan and myself) and Walter (the reviewer) do not know how 
to make DIP 1018 better.


That shouldn't justify accepting a DIP that might contain problems. But 
of course, if you don't think there are any problems.


--
/Jacob Carlborg


Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-25 Thread Andrei Alexandrescu via Digitalmars-d-announce

On 2/24/19 4:02 PM, Manu wrote:

On Sun, Feb 24, 2019 at 2:50 AM Mike Parker via Digitalmars-d-announce
 wrote:


Walter and Andrei have requested the Final Review round be
dropped for DIP 1018, "The Copy Constructor", and have given it
their formal approval. They consider copy constructors a critical
feature for the language.

Walter provided feedback on Razvan's implementation. When it
reached a state with which he was satisfied, he gave the green
light for acceptance.

The DIP:
https://github.com/dlang/DIPs/blob/master/DIPs/accepted/DIP1018.md


The implementation:
https://github.com/dlang/dmd/pull/8688


I mean like, my DIP was almost violently rejected, but in here there's
text like this:

"The parameter of the copy constructor is passed by a mutable
reference to the source object. This means that a call to the copy
constructor may legally modify the source object:"

I can't see how that could be seen in any way other than what might
reasonably be described as "a hole large enough to drive a truck
through"...


Thanks for the observation. We do not think this creates a hole in the
language. Indeed there is risk for misuse but we thought it's better to 
pass the "true" source of the copy to the constructor instead of 
affixing additional qualifiers to it. There are important simplicity 
benefits to doing so because "const" is ambiguous in D as it could 
originate either from mutable or immutable data. Furthermore, the risk 
is encapsulated in the type's implementation and not as a 
misunderstanding between the caller and the callee.


I'll add that pointing out a DIP's weaknesses in order to claim an 
injustice in another DIP is a understandable, but not productive. The 
proposers (Razvan and myself) and Walter (the reviewer) do not know how 
to make DIP 1018 better. Walter and I do know, and we have shared, how 
to make DIP 1016 better.



Andrei


Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-25 Thread H. S. Teoh via Digitalmars-d-announce
On Sun, Feb 24, 2019 at 08:59:49PM -0800, Walter Bright via 
Digitalmars-d-announce wrote:
[...]
> An interesting manifestation of this uselessness in C++ is the notion
> of "logical const", where a supposedly "const" value is lazily set to
> a value upon first use. I.e. it isn't const, it's just pretend const.

I disagree.  Logical const means the outside world can't tell that the
object has changed, because only a constant value is ever seen from
outside.  This is the basis of lazy initialization (which is part of the
concept of lazy evaluation), an important feature of FP style code, and
something that D does not support.

D's relaxed version of purity -- a function is pure if the outside world
can't see any impure semantics -- makes its scope much more widely
applicable than a strict interpretation of purity as in a functional
language.  Logical const is the same idea in the realm of mutability --
though I don't necessarily agree with C++'s anemic implementation of it.
What D could really benefit from was a statically-verifiable way of
lazily initializing something that is const to the outside world.

A derived problem with D's const is the inability to express a cached
const object.  You can't cache the object because it's const, which
greatly limits the scope of usability of const in large data structures.

The same limitation makes ref-counting such a huge challenge to
implement in D.  There is simply no way to associate a refcount with a
const object without jumping through hoops and/or treading into UB
territory by casting away const. There is no way to express that the
refcount is mutable but the rest of the object isn't. Well, you *can*
express this if you use circumlocutions like:

struct RefCounted(T) {
int refcount;
const(T) payload;
}

but that's worthless in generic code because const(RefCounted!T) !=
RefCounted!(const T). So you have to special-case every generic function
that needs to work with this type, and the special cases percolate
through the entire codebase, uglifying the code and forcing generic
functions that shouldn't need to know about RefCounted to have to know
about it so that they can work with it.


Because of these limitations, const is really only useful in low-level
modules of limited scope, in simple, self-contained data structures.
Higher-level, larger data structures are basically unusable with D's
const because lazy initialization and caching are not possible without
treading into UB territory by casting.  I'm not going to argue that
C++'s version of const is any better -- because non-enforceable const is
worthless, like you said -- but let's not kid ourselves that D's const
is that much better.  D's const is really only usable in very limited
situations, and there are many things for which it's unusable even
though logically it *could* have been applicable.


T

-- 
Two wrongs don't make a right; but three rights do make a left...


Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-25 Thread Andrei Alexandrescu via Digitalmars-d-announce

On 2/25/19 10:45 AM, Atila Neves wrote:
The *only* problem I have with const in D is that const values can't be 
copied, which is silly. I'd expect DIP1018 to fix that.


Affirmative. It was tricky.


Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-25 Thread Andrei Alexandrescu via Digitalmars-d-announce

On 2/25/19 1:06 AM, Nicholas Wilson wrote:

On Monday, 25 February 2019 at 02:56:13 UTC, Walter Bright wrote:

Your DIP, and nobody else is going to do it, so it falls to me.


It will be reviewed at Dconf, please make sure you have an _accurate_ 
summary of your criticisms of the DIP ready for then.


This seems to be a misunderstanding of protocol. A negative review is 
simply a signal that the submission has not been strong enough. As such, 
the submission, not the review, needs to be improved. There are 
similarities and differences between our DIP process and paper 
submission reviews at conferences and journals everywhere; one key 
similarity is that the submitters are on hook for providing convincing 
submissions, whereas reviewers are not required to defend their reviews. 
It's an asymmetric relationship that occasionally frustrates, but it is 
as such for good reason and it works.


It does happen in such processes that a submission is rejected wrongly, 
by means of reviews that do not reflect the quality of the submission. 
This is the case most often when a nonspecialist reviews a specialty 
paper and fails to appreciate the subtler aspects of the submission. In 
this DIP's case, we submit this is not the case here; to the extent the 
DIP failed to convey its intent, that is squarely a pervasive matter 
with the DIP itself. It is not a matter of misunderstanding 1-2 
sentences, but a problem of precision in specification that needs to be 
approached with due care.


Thorough feedback has been given, likely more so than for any other 
submission. A summary for the recommended steps to take can be found here:


https://forum.dlang.org/post/q2u429$1cmg$1...@digitalmars.com

It is not desirable to demand reviewers to do more work on the review or 
to defend it. Acceptance by bullying is unlikely to create good results. 
The target of work is squarely the proposal itself.


Our understanding after Manu asked for action items was that he would be 
up for the work in short order. Not wanting to step on any toes and seem 
like taking away credit, Walter decided to hold off on working on it 
although he wanted to do so now that the matter is in his hands. Now 
that after three weeks Manu gave permission, I assume Walter would be up 
for the task.



Andrei


Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-25 Thread Atila Neves via Digitalmars-d-announce

On Monday, 25 February 2019 at 00:38:02 UTC, Walter Bright wrote:
The problem with C++ const is it only goes one level, i.e. what 
I call "head-const". If you pass a T to a const parameter, 
anything T references remains mutable. It's more of a 
suggestion than anything reliable or enforceable. It only works 
if your data structures are simple aggregates, not graphs.


D's const has teeth. Nothing can be modified through T. If 
you're used to writing code that tweaks const data under the 
hood, D's const will never work for you. Yes, it means 
rethinking how the data and code is organized, and that can be 
painful. But it is how FP works. FP offers a number of 
advantages, and D's const offers a path into that.


I have no idea what people are talking about when they mention on 
this forum that D's const is useless. Nearly every function 
parameter in my code is `in`. Nearly every variable declaration 
uses `const` instead of `auto`, the main exception being when a 
function is constructing a value to return. Most member functions 
I write are const or inout. I use const in D as I do in C++: 
pretty much everywhere. Nearly every single time a function 
parameter in my code isn't const is when it's an input range.


I happened to be working on dpp at the time I wrote this:

$ ag 'auto ' source | wc -l
67
$ ag 'const ' source | wc -l
204

The *only* problem I have with const in D is that const values 
can't be copied, which is silly. I'd expect DIP1018 to fix that.





Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-24 Thread Nicholas Wilson via Digitalmars-d-announce

On Monday, 25 February 2019 at 02:56:13 UTC, Walter Bright wrote:

Your DIP, and nobody else is going to do it, so it falls to me.


It will be reviewed at Dconf, please make sure you have an 
_accurate_ summary of your criticisms of the DIP ready for then.



BTW, everyone should expect the DIP process to be brutal.


No! It should be thorough, that is a critical distinction.

It has to be, we're long past the stage where we can allow 
misshapen stuff to get into the language. Nobody was very kind 
with my bottom type DIP :-)


Perhaps because you responded to _precisely none_ of the feedback 
and wasted everybody's time?


You should read the dismissal of mine and Andrei's "static if" 
proposal for C++! (Ironically, it was later adopted after 
someone else redid it, after removing one of its keystone 
features.)


I have, it is hysterical in all senses to the word. I don't see 
how that relates to any of this.


Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-24 Thread Walter Bright via Digitalmars-d-announce

On 2/24/2019 8:04 PM, Manu wrote:

1. make code easier to understand?


const code is self documenting and protective against modification by
issuing the user helpful error messages.


I've had many people tell me they mean transitive const when they use const in 
C++. That is not self documentation. Nor is it very helpful. The very fact that 
const code compiles in C++ and surprises people when it doesn't compile in D 
shows the misunderstanding it engenders in C++ code. People infer that it is 
transitive when it is not.


Really, of what value is it to know that only the head can't be changed, with no 
information about the rest?


An interesting manifestation of this uselessness in C++ is the notion of 
"logical const", where a supposedly "const" value is lazily set to a value upon 
first use. I.e. it isn't const, it's just pretend const.




2. prevent common programming bugs?


You can't modify const data, for instance,


I know technically what it does. But that wasn't my question.



a copy constructor can't freely modify the source value...


C++ copy constructors are not required to declare the source as const:

"A non-template constructor for class X is a copy constructor if its first 
parameter is of type X&, const X&, volatile X& or const volatile X&, and either 
there are no other parameters or else all other parameters have default arguments"

 -- CPP98.12.8

Again, I know technically what it does. Not the value of it. I used C for a 
decade before const was introduced. I tried using it, and discovered that head 
const added nothing much of any value and I stopped bothering with it.




3. help with multithreaded coding problems?


This is a different conversation about `immutable` and `shared`.
`const` doesn't say anything about D's decisions relating to
thread-locality by default, which obviously still applies.


'immutable' data is implicitly shareable. Const allows the same functions to 
work on both shared immutable and non-shared mutable data. C++ has no way to say 
a function can work on both kinds of data, or even how to describe such data.




4. improve code generation?

Not a lot.


Actually, not at all. C++ const is useless for code generation because:

1. people cast away const (yes, they do!). I learned this the hard way and had 
to back out those optimizations.


2. other references may mutate it.

Because of (2) it is similarly useless in D, however, it allows the same 
functions to work on immutable and mutable data, and that does have value. (The 
optimizer can make use of immutable.)




I mean, you speak as if `const` is a synonym for `mutable` in C++...
const things are const.


Not only are they not (legal to cast it away!), they can be mutated by other, 
non-const pointers. (There's no way to specify "pointer to immutable" in C++.)
Furthermore, const tells you nothing about the rest of the data structure. C++ 
const is all fine if your data structure fits entirely in one struct. It's 
rather meaningless for more complex objects. You cannot write generic code:


void doSomething(T)(const T x) {...}

and rely on it to not modify T if T is a non-trivial object.



Alternatively, if const were spec-ed similar to C++ const, it would be
very easy to implement TransitiveConst!T as a tool.


You could specify it, but you couldn't use it. (There'd be all kinds of implicit 
conversion problems.) There's good reason why const is treated specially for 
overload resolution and implicit conversion. I.e.:


void foo(const T const * const * const * p);
 const T   * const * const * q;
foo(q); // oops!



One thing I quite agree with you on, though, if you really want to modify 
non-trivial const objects, then D's const isn't for you :-) If you don't believe 
the rewards of carefully designing the data structures and functions that 
operate on them so they can be const is worth it, then D's const isn't for you. 
For me, I think it is worth it. And yes, it ain't easy, as old habits die hard.


Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-24 Thread Manu via Digitalmars-d-announce
On Sun, Feb 24, 2019 at 6:35 PM Walter Bright via
Digitalmars-d-announce  wrote:
>
> I agree with your point that C++ const can be used in a lot more places than D
> const. Absolutely true.
>
> Missing from the post, however, is an explanation of what value C++ const
> semantics have. How does it:
>
> 1. make code easier to understand?

const code is self documenting and protective against modification by
issuing the user helpful error messages.


> 2. prevent common programming bugs?

You can't modify const data, for instance, a copy constructor can't
freely modify the source value...


> 3. help with multithreaded coding problems?

This is a different conversation about `immutable` and `shared`.
`const` doesn't say anything about D's decisions relating to
thread-locality by default, which obviously still applies.

Maybe you're trying to argue that a const object which contains an
escape-pointer to mutable data may lead to races? But that's not the
case, because all data is thread-local in D, so there's no races on
the mutable data either way unless it's `shared`... and then we need
to refer back to the thread I created months ago where `shared` is
useless and broken, and we REALLY need to fix that. (that is; `shared`
must have NO READ OR WRITE ACCESS to data members, only shared
methods, otherwise it's completely hollow)


> 4. improve code generation?

Not a lot. But this is a red-herring; D's const won't improve code
generation where it's not present in the code.
Contrary to C++, D has a much higher probability of seeing the whole
AST and not encountering opaque extern barriers, which means it would
be relatively easy for D to recognise that the const object contains
no pointers to mutable data (assessed recursively), and then enable
any such optimisations that const offers to D today.


> I know technically what it does (after all, I implemented it), but its value
> escapes me.

I mean, you speak as if `const` is a synonym for `mutable` in C++...
const things are const. It is however possible that they contain a
pointer that leads out of the const data back into the mutable world,
and that's *desirable* in a whole lot of circumstances. Take that
away, and we arrive where we are in D.

It's also easy to NOT have pointers to mutable data escaping const
objects; make them const too!
If you want to implement a semantic where the const-ness of a member
tracks the const-ness of the owner, maybe we can apply `inout` to
behave that way.
Assuming we apply rules similar to C++, it looks like:

  const(S) const_s; // const instance of S
  struct S
  {
int* a; // becomes `int const(*)`
const(int)* b; // const(int*)
inout(int)* c; // becomes const(int*) (or immtable(int*), etc)
  }

Alternatively, if const were spec-ed similar to C++ const, it would be
very easy to implement TransitiveConst!T as a tool. By any of these
means, could deploy it deliberately instead of unwillingly.


Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-24 Thread Walter Bright via Digitalmars-d-announce

Your DIP, and nobody else is going to do it, so it falls to me.

BTW, everyone should expect the DIP process to be brutal. It has to be, we're 
long past the stage where we can allow misshapen stuff to get into the language. 
Nobody was very kind with my bottom type DIP :-)


You should read the dismissal of mine and Andrei's "static if" proposal for C++! 
(Ironically, it was later adopted after someone else redid it, after removing 
one of its keystone features.)


Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-24 Thread Walter Bright via Digitalmars-d-announce
I agree with your point that C++ const can be used in a lot more places than D 
const. Absolutely true.


Missing from the post, however, is an explanation of what value C++ const 
semantics have. How does it:


1. make code easier to understand?
2. prevent common programming bugs?
3. help with multithreaded coding problems?
4. improve code generation?

I know technically what it does (after all, I implemented it), but its value 
escapes me.


Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-24 Thread Manu via Digitalmars-d-announce
On Sun, Feb 24, 2019 at 4:25 PM Walter Bright via
Digitalmars-d-announce  wrote:
>
> Thanks for letting me know you're abandoning the rvalue ref DIP.

It's not an "rvalue ref" DIP (which I think has confused a lot of
people), it's an rvalue *by-ref* DIP.
In my head, an "rvalue ref" DIP is something completely different,
useful for implementing move semantics of mismatching types.

Are you talking about my DIP or that other thing?

> I had held off
> working on it because I didn't want to duplicate efforts; we're short-staffed
> enough as it is.

'abandoning's a strong word, but I don't have motivation to work on it
right now. Please, be my guest!


Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-24 Thread Manu via Digitalmars-d-announce
On Sun, Feb 24, 2019 at 4:40 PM Walter Bright via
Digitalmars-d-announce  wrote:
>
> The problem with C++ const is it only goes one level, i.e. what I call
> "head-const". If you pass a T to a const parameter, anything T references
> remains mutable. It's more of a suggestion than anything reliable or
> enforceable. It only works if your data structures are simple aggregates, not
> graphs.
>
> D's const has teeth. Nothing can be modified through T. If you're used to
> writing code that tweaks const data under the hood, D's const will never work
> for you. Yes, it means rethinking how the data and code is organized, and that
> can be painful. But it is how FP works. FP offers a number of advantages, and
> D's const offers a path into that.
>
> For example, most of DMD is written in the C++ style where functions 
> frequently
> are written to both return some information *and* tweak the data structure. 
> This
> does not work with const. It needs to be reorganized so that getting 
> information
> about a data structure is separated from modifying the data structure. I've 
> made
> such changes in a few places in DMD, and have been very pleased with the 
> results
> - the code is much easier to understand.
>
> To sum up, you're quite right that you cannot write C++ style code using D
> const. It hast to be in a much more FP style. If you're not accustomed with FP
> style, this can be a difficult learning process. I know this from firsthand
> experience :-)

I agree with these facts, but your case-study is narrow, and you have
to stop saying "C++ style", which it really isn't.
It's very much D-style... almost all D code is written this way.
It's in conflict with too many other patterns, and they're not "C++
patterns", they're very legitimate D patterns.

Function pointers and delegates are often incompatible with const;
practically any code with some sort of call-back behaviour, and
anything that forms *any form* of traversible network where you'd like
any part of it to const fails. I've never written a program that was a
perfect tree. A small feature library maybe, but not a program that
does anything interesting.

It's great that we can write FP-ish code in D, it's particularly
useful for narrow, self-contained tasks; it helps me intellectually
factor some potentially complex leaf-level call-trees out of the
program structure, and I appreciate when libraries take that form; it
helps them have a smaller footprint in the larger complex suite. But
const doesn't play into that much, and if that can't interact with
normal D code, which is most code, then it's just not a useful piece
of language.

The proposition that everyone start writing straight-up FP code in D
is unrealistic, and if they wanted that, they'd use Rust every time.
People are here because they don't want to write Rust.

> For me the only real annoyance with const is I often cannot use "single
> assignment" style declarations with pointers:
>
> I.e.:
>
>  const int* p = 
>  p =  // error, good
>  *p = 4; // also error, not what I wished
>
> This C++ const does provide, and it's good, but it's not really worth that 
> much.

Are you serious? You can't honestly say C++ const is worthless?
Especially in comparison to D's const, which is _actually_ almost
completely worthless.
It really doesn't make anything better, and there's a whole class of
troublesome language issues that emerge from it being defined this
way.
The way C++ defines const is such that const can be used, and you can
integrate that code with other code.

I mean it seriously where I say I've tried to defend D's const for as
long as I've used D, but I can't escape the plain and honest reality
that D's const is not useful for almost anything practical.
Even the way you describe it above is like indulging in a little bit
of fetish, and I understand that, I try that every time thinking "I'm
gonna get it right... this time for sure! What a cool guy I am!", but
that never works out beyond a very small scope. const with a narrow
scope is where it's least impactful.

Then to make matters worse, `const` is a combinatorial testing
nightmare; you write your code mostly without const (because
conventional wisdom), and then you try and call into your lib from
various contexts and it just doesn't work. You need to set-up heaps of
tests to try and prove out that your code is const-robust that are
very easy to miss otherwise.
Then someone else tries to use your code with their code which is
using const (attempting at least); I've seen lots of libraries where
it would have been possible to support const, at least to some extent,
but they just didn't because "don't use const", but the result is that
the client of that library can't use const in their own code because
the lib undermines their effort in some way.

I don't like this concept that a piece of library code 'supports'
const, but that's where we are.

None of this is issue with C++ const, because it's defined in a way
that's useful, 

Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-24 Thread rikki cattermole via Digitalmars-d-announce

On 25/02/2019 10:22 AM, Walter Bright wrote:

I think we need to throw in the towel, C++'s const is right, and D's
const is just wrong, and no amount of pretending that's not true will
resolve the endless stream of issues.
Where's the DIP to migrate to C++-style const? That is the predicate
for basically every important development I've seen lately...
including this one.


If you want a DIP, write one! But I suggest the rvalue ref one first.


We have discussed this on IRC that const needs a redesign.
The problem is, without building a list of examples of where it fails we 
cannot really start the redesign process.


But once we do, I'm in.


Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-24 Thread Nicholas Wilson via Digitalmars-d-announce

On Sunday, 24 February 2019 at 21:22:33 UTC, Walter Bright wrote:

On 2/24/2019 1:02 PM, Manu wrote:

I mean like, my DIP was almost violently rejected,


I thought it was clear what was needed to be done with it, and 
I thought you were going to rewrite it. Was I mistaken?


Absolutely no, no. Yes!

"What needs to be done" is scattered throughout forum discussions 
filled with incorrect assumptions, most of which were resolved 
needing little change, absolutely nothing that justifies a 
rewrite over minor amendments (the text will be 95% the same, the 
sentiment will be 100% the same), neither I nor Manu plan to 
rewrite it. Note that none of that is reflected in the official 
review, most (if not all) of which is wrong (and you should 
update it!).


What is _actually_ going to happen is this will be an item on the 
agenda for the Foundation meeting at dconf: you will clarify the 
problems you have with the DIP; those problems will be discussed, 
evaluated and acted upon; and the DIP process will be amended to 
avoid the root cause of those problems.


Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-24 Thread Walter Bright via Digitalmars-d-announce
The problem with C++ const is it only goes one level, i.e. what I call 
"head-const". If you pass a T to a const parameter, anything T references 
remains mutable. It's more of a suggestion than anything reliable or 
enforceable. It only works if your data structures are simple aggregates, not 
graphs.


D's const has teeth. Nothing can be modified through T. If you're used to 
writing code that tweaks const data under the hood, D's const will never work 
for you. Yes, it means rethinking how the data and code is organized, and that 
can be painful. But it is how FP works. FP offers a number of advantages, and 
D's const offers a path into that.


For example, most of DMD is written in the C++ style where functions frequently 
are written to both return some information *and* tweak the data structure. This 
does not work with const. It needs to be reorganized so that getting information 
about a data structure is separated from modifying the data structure. I've made 
such changes in a few places in DMD, and have been very pleased with the results 
- the code is much easier to understand.


To sum up, you're quite right that you cannot write C++ style code using D 
const. It hast to be in a much more FP style. If you're not accustomed with FP 
style, this can be a difficult learning process. I know this from firsthand 
experience :-)


For me the only real annoyance with const is I often cannot use "single 
assignment" style declarations with pointers:


I.e.:

const int* p = 
p =  // error, good
*p = 4; // also error, not what I wished

This C++ const does provide, and it's good, but it's not really worth that much.


Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-24 Thread Walter Bright via Digitalmars-d-announce
Thanks for letting me know you're abandoning the rvalue ref DIP. I had held off 
working on it because I didn't want to duplicate efforts; we're short-staffed 
enough as it is.


Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-24 Thread Manu via Digitalmars-d-announce
On Sun, Feb 24, 2019 at 1:25 PM Walter Bright via
Digitalmars-d-announce  wrote:
>
> On 2/24/2019 1:02 PM, Manu wrote:
> > I mean like, my DIP was almost violently rejected,
>
> I thought it was clear what was needed to be done with it,

To be fair, initial criticism was 75% just plain wrong (like the text
wasn't even read properly, with no request for clarifications), and
100% unproductive.
True actionable criticisms became clear only after quite a laborious
and somewhat insulting series of exchanges.

> and I thought you were going to rewrite it. Was I mistaken?

It's not on my short list. I don't really even wanna look at it at
this point, my motivation couldn't be more depleted. There's no part
of me that has any desire to re-engage that process right now.
I'd encourage anybody else to take it and run though. It's still my #1
frustration... it's not getting less annoying!

Incidentally, the key problems that upset people about my proposal,
and probably the reason it wasn't that way from the very start are all
predicated on this same `const` issue.

> > but in here there's text like this:
> >
> > "The parameter of the copy constructor is passed by a mutable
> > reference to the source object. This means that a call to the copy
> > constructor may legally modify the source object:"
> >
> > I can't see how that could be seen in any way other than what might
> > reasonably be described as "a hole large enough to drive a truck
> > through"...
>
> What's the hole? BTW, the D copy-ctor semantics are nearly identical to that 
> of C++.

Mutable copy-from argument is one of the same arguments people made
against my DIP, except about 100x worse being a live object owned by
someone else that may be undesirably mutated, rather than an expiring
rvalue that nobody will ever see again.

I'm mostly just amazed that the same bunch of minds that historically
take such strong issue with this sort of thing can find that it's okay
in this case...
I can't imagine a more concerning case of this class of problem being
manifest, but in this case, we've judged that it's fine?

If this is acceptable now, then I think it's in order that we comb
back over decades of other rejected opportunities and revisit them
with this precedent.

> > But anyway, that's pretty wild. I think there's a clear pattern we've
> > been seeing here with practically every lifetime management DIP, and
> > also in general for forever, is that D's `const` just fundamentally
> > doesn't work.
>
> I don't see what const has to do with lifetime management. For example, it is
> irrelevant to dip25 and dip1000.

I say lifetime *management*; I feel copying/moving and friends are an
associated part of lifetime management beyond just tracking ownership.
Construction/destruction are features of lifetime management in my
brain.
We've had const problems with copying and constructors forever,
including this DIP, and the problems that this DIP exists for to
address.

> > Couple this with the prevailing wisdom which is to
> > recommend that people "don't use const, because you can't write
> > programs and use const"
>
> That is true for writing C++ style code. D const is much more in line with FP
> programming style.

It's true for writing D style code; most D-style code is not FP
code... at best, a few call-trees at the leaves of the application.
The overwhelming recommendation I see posted very frequently in the
forum is "don't use const", and the nature of all the articles I've
read on the topic as the years progress are moving towards a more
clearly stated and unashamed position of "don't use const".

I understand the narrow use case where it can be applicable to FP
style programming, but it comes up quite infrequently as an
opportunity, and attempts are often met with a rude awakening at some
point that you work far enough into your project that the fantasy of
your flawless design start to break while true details of the program
structure begin to emerge.

Almost every attempt I've made to try and use D's const effectively
has failed at some point down the path as I reach some level of
complexity where the program structure has relationships that start to
look like a graph. It just naturally occurs that data in a const
structure may point back to the outer non-const world again, and
that's totally *fine* structurally and intellectually, it's just that
D can't express it.

You basically have 2 options when this inevitably emerges; you sweep
your code removing const from a lot of things (which sadly highlights
a whole lot of wasted energy in doing so, and in your foolishly trying
in the first place), or you make some HeadConst!(T) thing which casts
const away, whereby you deploy UB and a quiet prayer that the compiler
doesn't do anything bad.

I've tried to defend D's const for a very long time, but the reality
is that every sufficiently complex program I've written has seen my
attempts with const fail at some level of complexity, and the forum
repeats the wisdom 

Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-24 Thread Walter Bright via Digitalmars-d-announce

On 2/24/2019 1:02 PM, Manu wrote:

I mean like, my DIP was almost violently rejected,
If it makes you feel any better, Razvan had to endure major rewrites of both the 
dip and the implementation.


Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-24 Thread Walter Bright via Digitalmars-d-announce

On 2/24/2019 1:02 PM, Manu wrote:

I mean like, my DIP was almost violently rejected,


I thought it was clear what was needed to be done with it, and I thought you 
were going to rewrite it. Was I mistaken?




but in here there's text like this:

"The parameter of the copy constructor is passed by a mutable
reference to the source object. This means that a call to the copy
constructor may legally modify the source object:"

I can't see how that could be seen in any way other than what might
reasonably be described as "a hole large enough to drive a truck
through"...


What's the hole? BTW, the D copy-ctor semantics are nearly identical to that of 
C++.



But anyway, that's pretty wild. I think there's a clear pattern we've
been seeing here with practically every lifetime management DIP, and
also in general for forever, is that D's `const` just fundamentally
doesn't work.


I don't see what const has to do with lifetime management. For example, it is 
irrelevant to dip25 and dip1000.




Couple this with the prevailing wisdom which is to
recommend that people "don't use const, because you can't write
programs and use const"


That is true for writing C++ style code. D const is much more in line with FP 
programming style.




I think we need to throw in the towel, C++'s const is right, and D's
const is just wrong, and no amount of pretending that's not true will
resolve the endless stream of issues.
Where's the DIP to migrate to C++-style const? That is the predicate
for basically every important development I've seen lately...
including this one.


If you want a DIP, write one! But I suggest the rvalue ref one first.



Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-24 Thread Manu via Digitalmars-d-announce
On Sun, Feb 24, 2019 at 2:50 AM Mike Parker via Digitalmars-d-announce
 wrote:
>
> Walter and Andrei have requested the Final Review round be
> dropped for DIP 1018, "The Copy Constructor", and have given it
> their formal approval. They consider copy constructors a critical
> feature for the language.
>
> Walter provided feedback on Razvan's implementation. When it
> reached a state with which he was satisfied, he gave the green
> light for acceptance.
>
> The DIP:
> https://github.com/dlang/DIPs/blob/master/DIPs/accepted/DIP1018.md
>
>
> The implementation:
> https://github.com/dlang/dmd/pull/8688

I mean like, my DIP was almost violently rejected, but in here there's
text like this:

"The parameter of the copy constructor is passed by a mutable
reference to the source object. This means that a call to the copy
constructor may legally modify the source object:"

I can't see how that could be seen in any way other than what might
reasonably be described as "a hole large enough to drive a truck
through"...

But anyway, that's pretty wild. I think there's a clear pattern we've
been seeing here with practically every lifetime management DIP, and
also in general for forever, is that D's `const` just fundamentally
doesn't work. Couple this with the prevailing wisdom which is to
recommend that people "don't use const, because you can't write
programs and use const"

I think we need to throw in the towel, C++'s const is right, and D's
const is just wrong, and no amount of pretending that's not true will
resolve the endless stream of issues.
Where's the DIP to migrate to C++-style const? That is the predicate
for basically every important development I've seen lately...
including this one.


Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-24 Thread Olivier FAURE via Digitalmars-d-announce

On Sunday, 24 February 2019 at 12:57:06 UTC, ag0aep6g wrote:

On 24.02.19 11:46, Mike Parker wrote:
Walter provided feedback on Razvan's implementation. When it 
reached a state with which he was satisfied, he gave the green 
light for acceptance.


Sounds like it might be a "worst acceptable proposal" [1] which 
Andrei says the DIP process is supposed to avoid.



[1] https://forum.dlang.org/post/q2ndr8$15gm$1...@digitalmars.com


If I'm understanding correctly, Andrei said that about the 
proposals, while Walter gave feedback on the implementation, 
which is a little different.


But yeah, the proposal was clearly fast-tracked, probably because 
it's needed for reference counting and better C++ integration.


Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-24 Thread ag0aep6g via Digitalmars-d-announce

On 24.02.19 11:46, Mike Parker wrote:
Walter provided feedback on Razvan's implementation. When it reached a 
state with which he was satisfied, he gave the green light for acceptance.


Sounds like it might be a "worst acceptable proposal" [1] which Andrei 
says the DIP process is supposed to avoid.



[1] https://forum.dlang.org/post/q2ndr8$15gm$1...@digitalmars.com


Re: DIP 1018--The Copy Constructor--Formal Review

2019-02-24 Thread Bastiaan Veelo via Digitalmars-d-announce

On Sunday, 24 February 2019 at 10:46:37 UTC, Mike Parker wrote:
Walter provided feedback on Razvan's implementation. When it 
reached a state with which he was satisfied, he gave the green 
light for acceptance.


The DIP:
https://github.com/dlang/DIPs/blob/master/DIPs/accepted/DIP1018.md


Yay! Congrats to Razvan. Was this a roadblock towards reference 
counting, or am I confused?


DIP 1018--The Copy Constructor--Formal Review

2019-02-24 Thread Mike Parker via Digitalmars-d-announce
Walter and Andrei have requested the Final Review round be 
dropped for DIP 1018, "The Copy Constructor", and have given it 
their formal approval. They consider copy constructors a critical 
feature for the language.


Walter provided feedback on Razvan's implementation. When it 
reached a state with which he was satisfied, he gave the green 
light for acceptance.


The DIP:
https://github.com/dlang/DIPs/blob/master/DIPs/accepted/DIP1018.md


The implementation:
https://github.com/dlang/dmd/pull/8688