Inability to dup/~ for const arrays of class objects

Steven Schveighoffer schveiguy at yahoo.com
Tue May 28 20:20:29 PDT 2013


On Tue, 28 May 2013 23:09:56 -0400, Michel Fortin  
<michel.fortin at michelf.ca> wrote:

> On 2013-05-29 02:25:01 +0000, "Steven Schveighoffer"  
> <schveiguy at yahoo.com> said:
>
>> On Tue, 28 May 2013 22:20:08 -0400, Jonathan M Davis  
>> <jmdavisProg at gmx.com>  wrote:
>>
>>> The syntax is actually the easy part. The problem is that the type  
>>> system
>>> itself doesn't differentiate between a class and a reference to a  
>>> class,  and
>>> the whole compiler is wired that way. So, while adding a new syntax   
>>> isn't that
>>> hard (several have been proposed before), actually implementing it is  
>>> a  royal
>>> pain (enough so that Walter gave up on it). It would definitely be  
>>> nice  to have
>>> that fixed though.
>>  No, this is wrong.  The issue is entirely syntax.  And it is hard,  
>> because  *conceptually*, it's difficult to separate out the reference  
>> from the  data.  It's hard to say "The part of C that isn't the  
>> reference" in a  succinct way.
>>  Michel Fortin has created a pull request to make
>>  const(T)ref
>>  work, and only apply the const to the data.  It's certainly doable.   
>> But  the syntax, as you can see, is ugly.
>
> Well, that pull request wasn't trivial to implement correctly and the  
> syntax took some time to come with. And also there's no guaranty Walter  
> would have accepted the somewhat contorted solution even though it was  
> working pretty well (but with no review comment it's hard to say).

I was not trying to say it was trivial, I'm sorry if it came across that  
way.  What I really meant was that if it was difficulty of implementation,  
Walter would have pulled that request seeing as you did all the work!

I don't think it's as much an issue with implementation as it is concept  
and perception.  To say that "C ref" is the same as C is really difficult  
to swallow, then you have ref const(C) ref, which looks horrible IMO.

>> As it turns out, we need more than this, and a more critical problem to  
>>  solve is creating tail-const custom ranges (I am working on an article  
>> to  discuss and hopefully address this).
>
> It's a different problem that'll require a different solution, and if it  
> requires special syntax it should be at the struct declaration, not at  
> the type declaration. Something like that:
>
> 	struct MyRange(inheritedconstness(T)) {
> 		T[] bla;
> 		this(const MyRange r) { bla = r.bla; }
> 	}
>
> 	immutable(MyRange!T) t; // real type becomes  
> immutable(MyRange!(immutable(T))
> 	MyRange!(immutable(T)) u = t; // calls above constructor
>
> Wouldn't this be enough?

I thought some sort of template (or parameterized) solution also.  I'm  
pretty convinced now that this method is unworkable.

I have an article I haven't touched since the plane ride home from dconf  
which discusses these problems, I need to finish it.  I think I have a  
good solution for both this and object references.  I don't want to set  
any expectations, so I'll leave it at that :)

-Steve


More information about the Digitalmars-d mailing list