On 4/11/22 05:57, wjoe wrote:

> To my understanding immutable data should reside in a separate data
> segment which itself could reside in ROM.

We are getting into implementation details which a programming language acts as not to care (but has to do especially when it's a system programming language like D. :) ).

> So when the variable, or 'pointer' to the data, goes out of scope just
> the 'pointer' is gone, the actual data unreachable, but still there.

I think it translates to the destructor never being executed. Otherwise, nobody would even know whether the memory location is reused for other pursposes later on.

> Due to its immutable nature immutable data can't be changed and this, to
> my understanding, includes deallocation.

D one language where object lifetime is deliberately separate from memory allocation.

> And because the data could be
> in ROM any modification is an error.

Fully agreed. However, how could I initialize such an object then? (You may have meant a read-only memory page instead of ROM.)

> immutable data on the fly doesn't make sense to me - that should be
> const's domain.

Even 'const' cause confusions because it's used in at least two different ways (even e.g. in C++):

1) I will not mutate data through this reference. For example, a parameter that is pointer to const achieves that:

  void foo (const(int)[] arr);

2) This variable is const:

  const i = 42;

Well, there is the confusion: There is no "reference" in the second case at all!

I don't agree with you when you say immutability should be const's domain because const covers item 1 above as well, where there is no immutability of data whatsoever. The data may be perfectly mutable or immutable, where my access will be readonly.

Perhaps you are saying the same thing but enters D's immutable: The data is immutable.

immutable data on the fly can be very useful because e.g. it makes multithreaded programming trivial in some cases by removing the need for locking.

> Strings, I know. But the way things are, I hardly see a
> difference between immutable and const.

Imagine a File struct that holds on to a file name. In C++, we would have to make a copy of the constructor argument for two reasons:

1) Lifetime of the object might be short. This is not a problem in D because of the GC.

2) The data might change after I start holding on to it through a reference. This is not a problem *only if* data were immutable because my const parameter cannot preclude the producer from mutating it further. Example:

import std.stdio;
import std.format;

struct S {
  const(char)[] fileName;

  this(const(char)[] fileName) {
    this.fileName = fileName;
    report();
  }

  ~this() {
    report();
  }

  void report(string func = __FUNCTION__) {
    writefln!"%s working with %s."(func, fileName);
  }
}

void main() {
  char[] fileName = "foo.txt".dup;
  auto s = S(fileName);
  fileName[0..3] = "bar";
}

The output shows that the file name changed between construction and destruction:

deneme.S.this working with foo.txt.
deneme.S.~this working with bar.txt.

If fileName were immutable, then the owner would not be able to mutate anyway, so the struct could get away without copying the file name.

Ali

Reply via email to