Re: WTF! new in class is static?!?!

2018-06-10 Thread Bauss via Digitalmars-d-learn

On Sunday, 10 June 2018 at 02:34:11 UTC, KingJoffrey wrote:

On Sunday, 10 June 2018 at 01:27:50 UTC, bauss wrote:

On Saturday, 9 June 2018 at 12:40:07 UTC, RealProgrammer wrote:
maybe you and others in the D 'community' should start paying 
attention to the 'opinions' of those who do professional 
development with professional compilers.


I do professional work with a professional compiler aka. The D 
compiler and I've been doing so for years.


Well then, you should like my idea for the dconf '2019' logo...

Dman and a bug, holding hands, and the bug saying "I'm not a 
bug, I'm a feature!".


Sure, because other compilers do not have bugs.


Re: WTF! new in class is static?!?!

2018-06-09 Thread KingJoffrey via Digitalmars-d-learn

On Sunday, 10 June 2018 at 01:27:50 UTC, bauss wrote:

On Saturday, 9 June 2018 at 12:40:07 UTC, RealProgrammer wrote:
maybe you and others in the D 'community' should start paying 
attention to the 'opinions' of those who do professional 
development with professional compilers.


I do professional work with a professional compiler aka. The D 
compiler and I've been doing so for years.


Well then, you should like my idea for the dconf '2019' logo...

Dman and a bug, holding hands, and the bug saying "I'm not a bug, 
I'm a feature!".





Re: WTF! new in class is static?!?!

2018-06-09 Thread bauss via Digitalmars-d-learn

On Saturday, 9 June 2018 at 12:40:07 UTC, RealProgrammer wrote:
maybe you and others in the D 'community' should start paying 
attention to the 'opinions' of those who do professional 
development with professional compilers.


I do professional work with a professional compiler aka. The D 
compiler and I've been doing so for years.


Re: WTF! new in class is static?!?!

2018-06-09 Thread aliak00 via Digitalmars-d-learn

On Friday, 8 June 2018 at 18:18:27 UTC, Jonathan M Davis wrote:
On Thursday, June 07, 2018 22:43:50 aliak via 
Digitalmars-d-learn wrote:
On Thursday, 7 June 2018 at 21:32:54 UTC, Jonathan M Davis 
wrote:

> [...]

Is that supposed to compile? -> https://run.dlang.io/is/SjUEOu

Error: cannot use non-constant CTFE pointer in an initializer 
&[42][0]


Not necessarily. It's the pointer equivalent of what the OP did 
with a mutable class reference, and I was using it for 
demonstrative purposes. The mutable class reference case didn't 
used to compile (it used to have to be immutable). This example 
is just the logic of what happens if it's legal with pointers 
too. If it hasn't been changed to be legal with pointers like 
it has been with classes, then that's arguably a good thing.


- Jonathan M Davis


Boh, it seems it actually has, just not with primitive types it 
seems:


struct A {
int i = 3;
}

struct B {
auto a = new A(3);
}


Above compile fine :o



Re: WTF! new in class is static?!?!

2018-06-09 Thread 12345swordy via Digitalmars-d-learn

On Saturday, 9 June 2018 at 13:49:48 UTC, 12345swordy wrote:


No, because you been caught making imposter accounts left and 
right. Which btw we can tell as your poor attempts to imposter 
me.


Well... why ya all r busy havin a go at me, the bugs remains (as 
do all D'other bugs).


Re: WTF! new in class is static?!?!

2018-06-09 Thread 12345swordy via Digitalmars-d-learn

On Saturday, 9 June 2018 at 13:24:49 UTC, KingJoffrey wrote:
On Saturday, 9 June 2018 at 12:56:55 UTC, rikki cattermole 
wrote:

But unlike you "king", Bauss isn't using tor to ban evade.


why you wanna ban little old me?

is it cause I made a crticism of D?


No, because you been caught making imposter accounts left and 
right. Which btw we can tell as your poor attempts to imposter me.


Re: WTF! new in class is static?!?!

2018-06-09 Thread KingJoffrey via Digitalmars-d-learn

On Saturday, 9 June 2018 at 12:56:55 UTC, rikki cattermole wrote:

But unlike you "king", Bauss isn't using tor to ban evade.


why you wanna ban little old me?

is it cause I made a crticism of D?

did i hurt your feelings?

..and everyone I know uses tor - and you should too - whether 
you're evading something or not - otherwise tor has no value - 
cause sites will just block tor - and then all those people that 
use tor for advancing human rights around the world, will lose 
the platform they need to do that, without being persecuted, 
cause they criticised something.





Re: WTF! new in class is static?!?!

2018-06-09 Thread rikki cattermole via Digitalmars-d-learn

But unlike you "king", Bauss isn't using tor to ban evade.



Re: WTF! new in class is static?!?!

2018-06-09 Thread RealProgrammer via Digitalmars-d-learn

On Saturday, 9 June 2018 at 11:47:54 UTC, bauss wrote:


Nobody cares about your opinion.

Nobody is forcing you to write code like that.

In fact most programs will be written without such code, for 
good reason.


Regardless if it does the "correct" thing or not.


Dude. That response is so childish. Don't speak to people like 
that.


And given that no mainstream compiler would allow you to share 
mutable data like that, maybe you and others in the D 'community' 
should start paying attention to the 'opinions' of those who do 
professional development with professional compilers.




Re: WTF! new in class is static?!?!

2018-06-09 Thread bauss via Digitalmars-d-learn

On Saturday, 9 June 2018 at 09:24:48 UTC, KingJoffrey wrote:
On Thursday, 7 June 2018 at 21:57:17 UTC, Steven Schveighoffer 
wrote:


Yep, long-standing issue: 
https://issues.dlang.org/show_bug.cgi?id=2947


Almost a decade old!

-Steve


Another reason why I still refuse to bring my code to D.

As if the module not respecting class encapsulation was not 
enough (see my rants about it elsewhere), D even allows two 
class instances to share non static mutable data!!


wtf!

--
import std.stdio;

class A
{
int[] c = [3,3];
}

void main()
{
A ca = new A;
A cb = new A;

ca.c[0] = 44;

writeln(cb.c[0]);
// prints 44 (in C++, Java and C#, this would - 
correctly - print 3)

}
---


Nobody cares about your opinion.

Nobody is forcing you to write code like that.

In fact most programs will be written without such code, for good 
reason.


Regardless if it does the "correct" thing or not.


Re: WTF! new in class is static?!?!

2018-06-09 Thread KingJoffrey via Digitalmars-d-learn
On Thursday, 7 June 2018 at 21:57:17 UTC, Steven Schveighoffer 
wrote:


Yep, long-standing issue: 
https://issues.dlang.org/show_bug.cgi?id=2947


Almost a decade old!

-Steve


Another reason why I still refuse to bring my code to D.

As if the module not respecting class encapsulation was not 
enough (see my rants about it elsewhere), D even allows two class 
instances to share non static mutable data!!


wtf!

--
import std.stdio;

class A
{
int[] c = [3,3];
}

void main()
{
A ca = new A;
A cb = new A;

ca.c[0] = 44;

writeln(cb.c[0]);
// prints 44 (in C++, Java and C#, this would - correctly 
- print 3)

}
---



Re: WTF! new in class is static?!?!

2018-06-08 Thread Jonathan M Davis via Digitalmars-d-learn
On Thursday, June 07, 2018 22:43:50 aliak via Digitalmars-d-learn wrote:
> On Thursday, 7 June 2018 at 21:32:54 UTC, Jonathan M Davis wrote:
> > struct S
> > {
> >
> > int* ptr = new int(42);
> >
> > }
>
> Is that supposed to compile? -> https://run.dlang.io/is/SjUEOu
>
> Error: cannot use non-constant CTFE pointer in an initializer
> &[42][0]

Not necessarily. It's the pointer equivalent of what the OP did with a
mutable class reference, and I was using it for demonstrative purposes. The
mutable class reference case didn't used to compile (it used to have to be
immutable). This example is just the logic of what happens if it's legal
with pointers too. If it hasn't been changed to be legal with pointers like
it has been with classes, then that's arguably a good thing.

- Jonathan M Davis



Re: WTF! new in class is static?!?!

2018-06-07 Thread DigitalDesigns via Digitalmars-d-learn
On Thursday, 7 June 2018 at 23:08:22 UTC, Steven Schveighoffer 
wrote:

On 6/7/18 6:58 PM, DigitalDesigns wrote:
On Thursday, 7 June 2018 at 21:57:17 UTC, Steven Schveighoffer 
wrote:

On 6/7/18 5:07 PM, DigitalDesigns wrote:

class A;

class B
{
    A a = new A();
}

auto b1 = new B();
auto b2 = new B();

assert(b1.a == b2.a)!!


Yep, long-standing issue: 
https://issues.dlang.org/show_bug.cgi?id=2947


Almost a decade old!



wait! everyone is saying it is a feature! So, which is it, a 
feature or a bug?!?!?


It's a feature that you can assign a static initializer to a 
class or struct member and have that work at compile time 
(using CTFE).


But when it's a reference to mutable data, it's a bug. Just the 
idea that you have implicitly shared data if you create 
instances in multiple threads should make it obviously a bug.


Even back then it was a debate, look at the bug report. But 
it's definitely a bug. Just hard to close since it will 
probably break a lot of code.


-Steve


I would expect that using a static initialize would not break as 
much code going from immutable to mutable than the other way 
around. Someone should have been smart enough to create a static 
new so both methods could have been implemented in a sane way.


Re: WTF! new in class is static?!?!

2018-06-07 Thread Steven Schveighoffer via Digitalmars-d-learn

On 6/7/18 6:58 PM, DigitalDesigns wrote:

On Thursday, 7 June 2018 at 21:57:17 UTC, Steven Schveighoffer wrote:

On 6/7/18 5:07 PM, DigitalDesigns wrote:

class A;

class B
{
    A a = new A();
}

auto b1 = new B();
auto b2 = new B();

assert(b1.a == b2.a)!!


Yep, long-standing issue: https://issues.dlang.org/show_bug.cgi?id=2947

Almost a decade old!



wait! everyone is saying it is a feature! So, which is it, a feature or 
a bug?!?!?


It's a feature that you can assign a static initializer to a class or 
struct member and have that work at compile time (using CTFE).


But when it's a reference to mutable data, it's a bug. Just the idea 
that you have implicitly shared data if you create instances in multiple 
threads should make it obviously a bug.


Even back then it was a debate, look at the bug report. But it's 
definitely a bug. Just hard to close since it will probably break a lot 
of code.


-Steve


Re: WTF! new in class is static?!?!

2018-06-07 Thread DigitalDesigns via Digitalmars-d-learn
On Thursday, 7 June 2018 at 21:57:17 UTC, Steven Schveighoffer 
wrote:

On 6/7/18 5:07 PM, DigitalDesigns wrote:

class A;

class B
{
    A a = new A();
}

auto b1 = new B();
auto b2 = new B();

assert(b1.a == b2.a)!!


Yep, long-standing issue: 
https://issues.dlang.org/show_bug.cgi?id=2947


Almost a decade old!

-Steve


wait! everyone is saying it is a feature! So, which is it, a 
feature or a bug?!?!?


Re: WTF! new in class is static?!?!

2018-06-07 Thread aliak via Digitalmars-d-learn

On Thursday, 7 June 2018 at 21:32:54 UTC, Jonathan M Davis wrote:


struct S
{
int* ptr = new int(42);
}



Is that supposed to compile? -> https://run.dlang.io/is/SjUEOu

Error: cannot use non-constant CTFE pointer in an initializer 
&[42][0]


Re: WTF! new in class is static?!?!

2018-06-07 Thread ag0aep6g via Digitalmars-d-learn

On 06/07/2018 11:26 PM, Ethan wrote:
The spec isn't clear on this but it uses the same rules as struct field 
initialisation, ie it's defined once and copied to each instance on 
creation.


https://dlang.org/spec/struct.html#default_struct_init


It says there that "The default initializers may not contain references 
to mutable data."


DMD enforces that for pointers to primitives, but not for arrays, class 
objects, or even pointers to structs:



struct S
{
int* p = new int(1); /* Error: cannot use non-constant CTFE pointer 
in an initializer */

int[] a = [1, 2, 3]; /* no error */
C c = new C; /* no error */
S2* s = new S2; /* no error */
}

class C { int x = 4; }
struct S2 { int x = 5; }


Seems inconsistent to me.


Re: WTF! new in class is static?!?!

2018-06-07 Thread Steven Schveighoffer via Digitalmars-d-learn

On 6/7/18 5:07 PM, DigitalDesigns wrote:

class A;

class B
{
    A a = new A();
}

auto b1 = new B();
auto b2 = new B();

assert(b1.a == b2.a)!!


Yep, long-standing issue: https://issues.dlang.org/show_bug.cgi?id=2947

Almost a decade old!

-Steve


Re: WTF! new in class is static?!?!

2018-06-07 Thread Adam D. Ruppe via Digitalmars-d-learn

On Thursday, 7 June 2018 at 21:07:26 UTC, DigitalDesigns wrote:
I'm glad I finally found this out! This is not typical behavior 
in most languages is it?



I don't think most languages allow this, and D used to not allow 
it either, but then CTFE got class support and it got enabled. If 
you understand how it works, it is sometimes useful...


But, it is confusing for a *lot* of people so it might make sense 
to ban it again - or at least make it more obvious that this is 
what you intended when you write it.


Re: WTF! new in class is static?!?!

2018-06-07 Thread Cym13 via Digitalmars-d-learn

On Thursday, 7 June 2018 at 21:07:26 UTC, DigitalDesigns wrote:

class A;

class B
{
   A a = new A();
}

auto b1 = new B();
auto b2 = new B();

assert(b1.a == b2.a)!!


I'm glad I finally found this out! This is not typical behavior 
in most languages is it?


I'd expect it to be translated to something like

class B
{
   A a;
   this()
   {
   a = new A();
   }
}

In C# it is different, can't remember if it is different in 
C++. This has caused bugs in my code because the fields are all 
pointing to the same data when I expected them to each have 
unique data ;/


This method is error prone and the behavior should be reversed, 
it should not break the majority of code. If one wants the 
current behavior then static new could be used or something 
else.


The spec looks pretty clear to me on that point 
https://dlang.org/spec/class.html#field-init


Besides, defining behaviour at construction is what constructors 
are for, I wouldn't expect anything outside a constructor to 
happen when an object is constructed. So while I understand that 
other languages may (successfully for them) do things differently 
I don't think I'd like a breaking change for that.


Re: WTF! new in class is static?!?!

2018-06-07 Thread Stefan Koch via Digitalmars-d-learn

On Thursday, 7 June 2018 at 21:07:26 UTC, DigitalDesigns wrote:

class A;

class B
{
   A a = new A();
}

auto b1 = new B();
auto b2 = new B();

assert(b1.a == b2.a)!!


I'm glad I finally found this out! This is not typical behavior 
in most languages is it?


I'd expect it to be translated to something like

class B
{
   A a;
   this()
   {
   a = new A();
   }
}

In C# it is different, can't remember if it is different in 
C++. This has caused bugs in my code because the fields are all 
pointing to the same data when I expected them to each have 
unique data ;/


This method is error prone and the behavior should be reversed, 
it should not break the majority of code. If one wants the 
current behavior then static new could be used or something 
else.


If you want a new one use a constructor call.
initalizers are support to be static, this only works because 
ctfe supports newing classes.




Re: WTF! new in class is static?!?!

2018-06-07 Thread Jonathan M Davis via Digitalmars-d-learn
On Thursday, June 07, 2018 21:07:26 DigitalDesigns via Digitalmars-d-learn 
wrote:
> class A;
>
> class B
> {
> A a = new A();
> }
>
> auto b1 = new B();
> auto b2 = new B();
>
> assert(b1.a == b2.a)!!
>
>
> I'm glad I finally found this out! This is not typical behavior
> in most languages is it?
>
> I'd expect it to be translated to something like
>
> class B
> {
> A a;
> this()
> {
> a = new A();
> }
> }
>
> In C# it is different, can't remember if it is different in C++.
> This has caused bugs in my code because the fields are all
> pointing to the same data when I expected them to each have
> unique data ;/
>
> This method is error prone and the behavior should be reversed,
> it should not break the majority of code. If one wants the
> current behavior then static new could be used or something else.

Well, if that compiles now with a non-immutable class object, then that was
a language improvement.

In any case, yes, the class object would be shared across all instances of
the class.

_Every_ type in D has an init value that they get default-initialized to
before the constructor is run (assuming that the type even has a
constructor). In the case of both classes and structs, whatever the member
variables are directly initialized with make up the init value. So, if you
have something like

struct S
{
int i = 42;
}

then every instance of S will start with the value of 42 for i, and if you
have something like

struct S
{
int i = 42;

this(int j)
{
i = j;
}
}

then S.i is 42 before the constructor is run and will then be whatever it
gets assigned to in the constructor after the constructor has run.

The situation with classes is exactly the same as structs except that you
don't have direct access to the init value (since you only ever deal with
class references, not the classes themselves). One key result of this is
that the class object is fully initialized to its init value for its exact
type before _any_ constructors are called, so you don't get that problem
that C++ has where the object isn't fully its correct type until all of the
constructors have been called (so calling virtual functions from a class
constructor in D actually works, unlike C++).

All of this is quite clean with value types, but in the case of member
variables that are pointers, dynamic arrays, or reference types that would
mean that if you had something like

struct S
{
int* ptr = new int(42);
}

every instance of S would have the same exact value for S.ptr, which can be
surprising and is why it's sometimes been suggested that it not be legal to
directly initialize member variables with mutable, non-value types. However,
historically, this really only mattered for dynamic arrays, because
originally it wasn't legal to directly initialize any member variable that
was a pointer or reference, because the compiler and runtime weren't
sophisticated enough to handle it. Several years ago, it was made possible
to directly initialize immutable class references, but that doesn't really
cause any problems, since sharing an immutable object doesn't cause
problems. However, if it's now possible for the init value of an object to
contain a mutable class reference or pointer, then the problem does get
worse, and arguably, it becomes more critical to just make it illegal in the
case of member variables in order to avoid the surprises (and bugs) that
come when folks misunderstand what it really means to directly initialize a
member variable in D.

In any case, the way that D works here is a direct result of how init values
work, and it really doesn't make sense for it to work any other way. At
most, it would make sense to simply make it illegal to directly initialize
types where it would be a problem.

- Jonathan M Davis



Re: WTF! new in class is static?!?!

2018-06-07 Thread Ethan via Digitalmars-d-learn

On Thursday, 7 June 2018 at 21:07:26 UTC, DigitalDesigns wrote:

assert(b1.a == b2.a)!!


The spec isn't clear on this but it uses the same rules as struct 
field initialisation, ie it's defined once and copied to each 
instance on creation.


https://dlang.org/spec/struct.html#default_struct_init


WTF! new in class is static?!?!

2018-06-07 Thread DigitalDesigns via Digitalmars-d-learn

class A;

class B
{
   A a = new A();
}

auto b1 = new B();
auto b2 = new B();

assert(b1.a == b2.a)!!


I'm glad I finally found this out! This is not typical behavior 
in most languages is it?


I'd expect it to be translated to something like

class B
{
   A a;
   this()
   {
   a = new A();
   }
}

In C# it is different, can't remember if it is different in C++. 
This has caused bugs in my code because the fields are all 
pointing to the same data when I expected them to each have 
unique data ;/


This method is error prone and the behavior should be reversed, 
it should not break the majority of code. If one wants the 
current behavior then static new could be used or something else.