Re: reference variables don't exist, but can simulate them

2020-06-28 Thread Stanislav Blinov via Digitalmars-d-learn

On Monday, 29 June 2020 at 02:11:15 UTC, NonNull wrote:

Deprecation: Cannot use alias this to partially initialize 
variable j of type refer. Use j._()


This is for the line j=3

What is this about? Where does this hidden rule come from?


That one comes from [1]. But there are quite a few more "hidden" 
rules that you're violating here. Try putting @safe on your main 
and compiling with -preview=dip1000 (for dmd, refer to your 
compiler's help if you're using others). The bulk of escape 
analysis is only done for @safe, and only with that DIP enabled 
(IIRC only some trivial checks are done otherwise).


[1] https://issues.dlang.org/show_bug.cgi?id=19441


Re: reference variables don't exist, but can simulate them

2020-06-28 Thread NonNull via Digitalmars-d-learn

On Sunday, 28 June 2020 at 21:01:36 UTC, NonNull wrote:

On Sunday, 28 June 2020 at 20:59:59 UTC, NonNull wrote:

Using gdc (Ubuntu 8.4.0-1ubuntu1~18.04) 8.4.0
Please criticize:

struct refer(T) {
  T* ptr;
  this(ref T x) { ptr =  }
  ref T _() { return *ptr; }
  alias _ this;
  string toString() { import std.conv; return to!string(*ptr);
 }
}

This will make a reference variable (simulation). [ toString() 
is just for writeln. ]


void main() {
int i = 100;
refer!int j = i;
j = 3;
writeln(i);
i = 100;
writeln(j);
j += 3;
writeln(i);
refer!int k = j;
writeln(k);
}

And a refer!int can be returned as it is just a value. 
Returning one that contains a pointer to a local variable 
leads to a compilation error.


* does not lead to a compilation error


Now with a different compiler I this:

Deprecation: Cannot use alias this to partially initialize 
variable j of type refer. Use j._()


This is for the line j=3

What is this about? Where does this hidden rule come from?



Re: reference variables don't exist, but can simulate them

2020-06-28 Thread NonNull via Digitalmars-d-learn

On Sunday, 28 June 2020 at 20:59:59 UTC, NonNull wrote:

Using gdc (Ubuntu 8.4.0-1ubuntu1~18.04) 8.4.0
Please criticize:

struct refer(T) {
  T* ptr;
  this(ref T x) { ptr =  }
  ref T _() { return *ptr; }
  alias _ this;
  string toString() { import std.conv; return to!string(*ptr);  
}

}

This will make a reference variable (simulation). [ toString() 
is just for writeln. ]


void main() {
int i = 100;
refer!int j = i;
j = 3;
writeln(i);
i = 100;
writeln(j);
j += 3;
writeln(i);
refer!int k = j;
writeln(k);
}

And a refer!int can be returned as it is just a value. 
Returning one that contains a pointer to a local variable leads 
to a compilation error.


* does not lead to a compilation error



reference variables don't exist, but can simulate them

2020-06-28 Thread NonNull via Digitalmars-d-learn

Using gdc (Ubuntu 8.4.0-1ubuntu1~18.04) 8.4.0
Please criticize:

struct refer(T) {
  T* ptr;
  this(ref T x) { ptr =  }
  ref T _() { return *ptr; }
  alias _ this;
  string toString() { import std.conv; return to!string(*ptr);  }
}

This will make a reference variable (simulation). [ toString() is 
just for writeln. ]


void main() {
int i = 100;
refer!int j = i;
j = 3;
writeln(i);
i = 100;
writeln(j);
j += 3;
writeln(i);
refer!int k = j;
writeln(k);
}

And a refer!int can be returned as it is just a value. Returning 
one that contains a pointer to a local variable leads to a 
compilation error.