How mutable is immutable?

Denis Shelomovskij verylonglogin.reg at gmail.com
Sun Jan 1 01:40:14 PST 2012


So, I'm a function `f`, I have an `immutable(type)[]` argument and I 
want to store it for my friend `g` in an TLS variable `v`:
---
string v;
debug string sure;

void f(string s) { v = s; debug sure = s.idup; }
void g() { assert(v == sure); }
---
I also store a copy of `s` into `sure` for my friend to ensure immutable 
date hasn't been mutated.
Can my friend's assertion ever fail without breaking a type-system?
Sure. Just consider this:
---
void main() {
     auto s = "abba".idup;
     f(s);
     delete s;
     g();
}
---
Is it by-design? Looks like deleting immutable (and const because of 
implicit conversion) data should be prohibited.
OK. Let `delete` be fixed. Can we still fail?
---
void h() {
     immutable(char)[4] s = "abba";
     f(s);
}
void main() {
     h();
     g();
}
---
Damn! So, what can we do with it? Not sure, but I have a proposal.

Fix it in language:
     * disallow `delete` of const/immutable data
     * disallow immutable data on the stack

This makes data really immutable if I don't miss something. Anyway, I 
want `immutable` qualified data to be immutable without breaking a 
type-system (if one do it, its his own responsibility), so some changes 
should be made (IMHO).


More information about the Digitalmars-d mailing list