Hi, i haven't been here for so long time. So hi all. I'm back again.
I was considering myself as hardcore D hacker, but in one point I fail completly. Constness. Consider this simple code: module ct; class C { const int a; const C b; this(int a_) { a = a_; b = null; } this(int a_, in cord b_) { a = a_; b = b_; } C m() const { // line 16 return b; } } void main() { C c1 = new C(1); C c2 = new C(2, c1); c2 = c2.m(); // 23 } So I have class C which all methods are "const". So it is completly immutable object, one can say. The problem is with line 16, I define function m which is const (because it doesn't change anything). But i'm returing some part of it, so actually somone else can change it hypotetically Actually it is impossible for two reasons: * all fields are const, * there is no non-consts methods beside constructors. Of course compiler says here: (dmd 2.028) ct.d(16): Error: cannot implicitly convert expression (this.b) of type const(C) to ct.C so we change line 16 to: const(C) m() const { // line 16 And I can agree that this is correct solution. but then there is another problem, now in main() function: ct.d(23): Error: cannot implicitly convert expression (c2.m()) of type const(C) to ct.C So now, i need to change all occurence of C to const(C), ok no problem: void main() { const(C) c1 = new C(1); const(C) c2 = new C(2, c1); c2 = c2.m(); // line 23 } Ok, nice. I can create some alias so it will be easier to use, also. But now is another problem: ct.d(23): Error: variable ct.main.c2 cannot modify const But I wan't to have possibility to change local reference to this class! Shouldn't const be about content of object? Ok, go and just create new variable: void main() { const(C) c1 = new C(1); const(C) c2 = new C(2, c1); auto c3 = c2.m(); // line 23 } compiler now will be happy. Ok, it is good for functional style of programing, but consider this: void main() { const(C) c1 = new C(1); const(C) c2 = new C(2, c1); while (c2 !is null) { c2 = c2.m(); // line 23 } writefln(c2.a); } So now i need to write tail recursive version of this loop, because compiler doen't allow me to reuse variable. I can write tail recursive loop, but it's: * not so efficient * users of my library are not familiary with functional programing * it's unnatural. Horiblle. How to ensure constness of data, and still have possibility of changing references of local variables? -- Witold Baryluk <bary...@smp.if.uj.edu.pl>
pgpWH8Ah3jtA1.pgp
Description: PGP signature