Persistent list
Andrei Alexandrescu via Digitalmars-d
digitalmars-d at puremagic.com
Sun Nov 15 13:06:51 PST 2015
On 11/15/2015 03:17 PM, Timon Gehr wrote:
> On 11/15/2015 08:57 PM, Andrei Alexandrescu wrote:
>> On 11/15/2015 01:50 PM, Jonathan M Davis wrote:
>>> On Sunday, 15 November 2015 at 18:09:15 UTC, Andrei Alexandrescu wrote:
>>>> On 11/15/2015 01:00 PM, Jonathan M Davis wrote:
>>>>> Basically, we have to decide between having physical const with the
>>>>> guarantees that it provides
>>>>
>>>> We have that - it's immutable. -- Andrei
>>>
>>> Yes and no. As it stands, I can know that
>>>
>>> const foo = getFoo();
>>> foo.bar();
>>>
>>> won't mutate foo unless I have another, mutable reference to foo
>>> somewhere that bar somehow accessed.
>>
>> That is an illusion, and we need to internalize that. Consider:
>>
>> // inside some module
>> struct T
>> {
>> int[] data;
>> void bar()
>> {
>> // look, ma, no hands
>> g_data[1]++;
>> }
>> }
>> static int[] g_data;
>> const(T) getFoo()
>> {
>> T result;
>> result.data = g_data = [1, 2, 3];
>> return result;
>> }
>> ...
>
>
> This is the exact exception he described i.e. "unless I have another,
> mutable reference to foo somewhere that bar somehow accessed."
Nope. He doesn't have a reference; the implementation has
surreptitiously, without the caller's knowledge.
Big difference! That means the modular typechecker cannot make any
assumption about the immutability of that object.
Let me repeat: const is already as weak as some fear it might be.
(Immutable is fine.)
> (Also, 'bar' should be 'const'.)
Right.
>> In other words, you truly need access to the implementation of getFoo()
>> in order to claim anything about the changeability of stuff.
>
> No, e.g., make either 'getFoo' or 'bar' pure.
Well but it's not. Keep the goalposts where they are. This is about
"const". I do agree that "pure const" may have other, stronger
properties. But let's discuss "const" and what it can promise, or move
over to a whole new topic of "pure const".
>> Note that I
>> could even afford to have getFoo() return const, so no need for the
>> caller to make it so!
>>
>> With immutable, it's all cool. Immutable data is truly immutable, and
>> that can be counted on. But const, even today, cannot be assumed to be
>> as strong.
>> ...
>
> This is obviously true (it is what justifies the distinction between
> const and immutable in the first place), but this is not a way to
> justify making it weaker.
Weaker than what? I've just shown black on white it's not a guarantee of
constant data. Today. With no compiler bugs in sight.
> This is all just moving in the direction of a
> setting where all structs/classes just prevent immutable construction
> and make all member functions const, and const becomes the new mutable.
> I don't see the point.
I don't understand this.
Andrei
More information about the Digitalmars-d
mailing list