New slides about Go

Max Samukha spambox at d-coding.com
Fri Oct 15 01:49:19 PDT 2010


On 10/15/2010 05:55 AM, Walter Bright wrote:

>
> D has pointers that you cannot do arithmetic on - called references. The
> semantics are carefully designed so a function cannot return a reference
> to a local, this is so that such locals will not have to be put onto the
> garbage collected heap. Hence, references are usable in safe mode.

I think the above statement needs clarification. Honestly, I don't 
understand how references to non-class objects are supposed to work in 
SafeD. Consider:

struct S
{
     int x;
}

static S s;
ref S foo()
{
     return s;
}

void bar()
{
     foo().x = 1;
     assert(s.x == 1); // ok, s updated

     auto s2 = foo();
     s2.x = 2;
     assert(s.x == 2); // not ok, we need to use a pointer as below

     auto s3 = &foo();
     s3.x = 3;
     assert(s.x == 3); // ok, s updated
}

Since pointers are not allowed in SafeD, any non-trivial operations on a 
referenced object are extremely awkward because you have to pile all of 
them around the call returning the reference. For example, if I want to 
update s and then pass it by reference to another function:

void baz(ref S s)
{
}

void bar()
{
     baz(foo(s).x = 1); // awkward
}

Of course, we can use tricks like a @trusted Ref struct wrapping a 
pointer to the referenced object. But I don't know how such a struct can 
prevent one from returning locals:

struct Ref(T)
{
     T* p;
     this(ref T v) { p = &v; }
     ref T getRef() { return *p; }
     alias getRef this;
}

ref Ref!T byref(T)(ref T v)
{
     return Ref!T(v);
}

ref S foo()
{
     S s;
     return byref(s); // local successfully escaped
}

Please comment.




More information about the Digitalmars-d mailing list