On Mon, 18 Jan 2010 11:17:53 -0500, Michel Fortin <michel.for...@michelf.com> wrote:

On 2010-01-18 10:08:34 -0500, "Denis Koroskin" <2kor...@gmail.com> said:

It's as simple as that: require '*' to denote reference type. What does it give?

It works like that in Objective-C where object variables must always be pointer to objects (enforced by the compiler), and it's not so bad. It's undoubtedly cleaner to read without '*', but as you illustrate it cause issues.

3) No more issues with tail-const, tail-shared, tail-immutable; deprecate Rebindable (this one was recently discussed):

That's the issue that bothers me most about the current syntax. Rebindable is a nice trick, but it's a hackish solution thrown at a syntactic problem. And it's not so rare either when you're working with immutable objects. It'd be much better if the syntactic problem didn't exist in the first place. Compare this

        Rebindable!(immutable Object) object;

to this:

        immutable(Object)* object;

The second is much easier to read. By getting rid of this template trickery playing with the type system and replacing implicit references with the almost identical concept of pointer, I think we would make the language easier to grasp.

Are we too late in D2 development to make this change? I'm in support of it.

One of the biggest problems with C++ class references is the stupid -> operator. I think D has avoided that in the best way possible. I think probably this change wouldn't be too bad, especially given how auto works:

auto c = new C(); // works for both explicit and implicit reference style

The one thing I would insist is that classes cannot be allocated on the stack unless explicitly created via scope, and even then a variable can never be of class type without reference:

C c; // error, cannot declare a variable of type C.
scope C c; // error, cannot declare a variable of type C.
scope C* c = new C(); // ok, allocated on stack and c works just like a normal C reference
scope c = new C(); // equivalent to above line.

This would leave the slicing problem solved the same way it is now -- you can stack allocate but only when you specifically request it.

And if you can never declare a variable of class type without denoting it is a reference, then the only place code is affected is declarations where auto is not involved.

I think we are too late for D2, the book is pretty much finished except for the concurrency chapter. It is a great idea though, I would have loved to see this happen before D2 was released. Maybe D3 can have this change.

-Steve

Reply via email to