On 1-dic-10, at 20:07, Michel Fortin wrote:

On 2010-12-01 09:37:08 -0500, Michel Fortin <[email protected]> said:

On 2010-12-01 06:17:24 -0500, Jonathan M Davis <[email protected]> said:
I proposed the following a while ago. First allow the class reference
to (optionally) be made explicit:
C a;     // mutable reference to mutable class
C ref b; // mutable reference to mutable class
And now you can apply tail-const to it:
const(C)ref c;  // mutable reference to const class
const(C ref) d; // const reference to const class
const(C) e;     // const reference to const class
The real issue is not syntax but getting it into the compiler. Apparently, there are difficulties in implementing tail const in the compiler which made Walter give up on it in the past. It should be doable, but Walter is totally sick of the issue and doesn't want to put the time in to do it - he has plenty on his plate as it is. So, if it's going to be done, someone else has to step up to the plate and do it. And with the general lack of dmd developers, that hasn't happened. No
one thus far has had both the inclination and the time.
Well... I just took a quick look at the problem from inside the compiler. The issue is this: the compiler has a type hierarchy, and TypeClass is one type in it. There is no separate type for a class reference, it just uses TypeClass do designate a class reference, which means that if your TypeClass has the const or immutable modifier, so does your reference. So either we create a TypeClassRef to designate the reference, or we add additional flags to TypeClass for the reference's modifier; in either case many parts of the semantic analysis has to be revised to take this into account.

Turns out it's there's a trick that makes it much simpler than I expected. Patch coming soon. ;-)

great!

well as your are at it I would argue a bit more on the syntax.
In my opinion it is useful more useful to have a weak_const, (or @tail const , or *const, I don't care so much about the syntax, but I care about the concept), like I sketched in my post, and not just fix the class issue. Indeed as I did try to argue it is useful to have an easy way to say "all my local stack memory might be modified, but not anything that it refers to" (thus weak const). This is the maximum modifiability that one can allow to arguments to pure functions, so a very useful level of protection.
weak_const can be defined recursively:
weak_const T
is
- const(T) if T is a reference, a D has not rebinding of refs (otherwise it should protect only the object, not the rebinding of the ref).
- T if T is a basic type, function or delegate
- const(U)* if is(T U==U*)
- const(U)[] if is(T U==U[]) // this is a special case of the next
- WeakConst!(T) if (T==struct) where WeakConst!(T) is a structure like T, but where all its fields are weak_const (i.e. apply recursively weak_const to the content of the structure.

Indeed the recursion on the structure is the most complex thing, and might be an implementation challenge, but if doable it would be very nice. Basically one has to set a flag for all things that are local, and would not be affected by the weak const.

I suppose that will probably considered too difficult to implement, but I wanted to propose it again because I find that it is the most clean solution conceptually.

Fawzi

Reply via email to