Why does 'string' alias immutable(char)[] and not immutable(char[]) ?

spir denis.spir at gmail.com
Wed Dec 1 06:44:08 PST 2010


On Wed, 1 Dec 2010 03:25:24 -0800
Jonathan M Davis <jmdavisProg at gmx.com> wrote:

> On Wednesday 01 December 2010 03:17:48 spir wrote:
> > Well, nearly everything is in the title... I would intuitively opt for the
> > second type if I had to define an immutable string type.
> > 
> > Answers from various points of view (semantic, praticality, efficiency...)
> > would be great if ever they may differ.
> 
> string str = "hello";
> str ~	= " world";
> 
> That's wouldn't be possible if string were fully immutable.

This, I do not understand. I thought immutable applies to the value, not to the variable. At least, this is what I know from other languages using immutable; but it seems, then, that this term does not mean the same in D. Immutable, for me, mean no reference to the value can change it. Thus, for instance:
    immutable(char[]) s = "abc";
    immutable(char[])* p = &s;
    *p = "def";     // Error: *p is not mutable

EDIT: All right, got it! I was caught once more by the fact that, for most types, in languages of the traditional imperative kind, a variable maps to a memory cell. Thus, immutability of the value also means "unchange-ability" of the variable. In other words:
    s = "def";      // Error: variable __trials__.main.s cannot modify immutable
because there is no way to change or replace s's value without mutating the original one. If I change s, then *p will see it. Is this reasoning correct?

(I was mislead because, in functional and dynamic languages from which I learnt the notion of immutability, elements are referenced, so that one can change a variable denoting an immutable value: it just silently points to another place in memory, but the original value never mutates. In such a language, changing s would not affect any other reference to the original value. Eg, python strings are immutable and referenced:
    s = "abc" ; t = s
    s = "def"
    print s,t		# "def abc"
)

> And since the fact 
> that the elements of a string are immutable, passing a string to a function is 
> guaranteed not to mess with the original, even if they append to the one passed 
> in. So, making it fully immutable wouldn't really buy you anything anyway.

Yop.

> - Jonathan M Davis

Thank you, Jonathan.

Denis
-- -- -- -- -- -- --
vit esse estrany ☣

spir.wikidot.com



More information about the Digitalmars-d-learn mailing list