D safety! New Feature?
Mark J Twain via Digitalmars-d
digitalmars-d at puremagic.com
Fri Aug 5 18:57:50 PDT 2016
On Friday, 5 August 2016 at 21:12:06 UTC, ag0aep6g wrote:
> On 08/05/2016 09:39 PM, Mark J Twain wrote:
>> In the case of ImmutableQueue, There is no Enqueue!
>>
>> See, there is a difference between "not callable" and "does
>> not exists".
>
> Ok, but what cool stuff is enabled by "does not exist" that
> doesn't work (as nicely) with "not callable"? As far as I can
> tell, there is no difference in practice.
>
> [...]
>> `immutability` only logically makes something immutable, as it
>> can
>> easily be proved. One can cast out immutable and mutate very
>> easily(take
>> address, change values).
>
> Casting immutable away and then mutating is not allowed by the
> language. It has undefined behavior. After doing it, the
> program may see the old value, it may see the new value, it may
> crash, or it may behave completely crazy.
>
> Some example code that shows different outcomes of mutating
> immutable data:
>
> ----
> void main()
> {
> import std.stdio;
>
> immutable int i = 1;
> * cast(int*) &i = 2;
> writeln(i); /* prints "1" */
> writeln(*&i); /* prints "2" */
>
> immutable int* p = new int(3);
> *(cast(int*) p) = 4;
> writeln(*p); /* prints "4" */
>
> immutable(char)[] s = "a";
> (cast(char[]) s)[0] = 'b'; /* segfault on Linux */
> writeln(s); /* prints "b" on Windows */
> }
> ----
>
> That's not a valid D program at all, of course. All of the
> mutations are invalid.
>
>> `Immutable` cannot be cast because there is no
>> type relationship.
>
> You can cast between completely unrelated types no problem:
>
> ----
> struct MutableSomething
> {
> int value;
> void mutate(int newValue) { value = newValue; }
> }
>
> struct ImmutableSomething
> {
> int value;
> /* no mutate method here */
> }
>
> void main()
> {
> auto i = ImmutableSomething(1);
> (cast(MutableSomething) i).mutate(2);
> import std.stdio;
> writeln(i.value); /* prints "2" */
> }
> ----
wow, that seems like a huge design issues.
Change one value to double though and it won't work. It's not
general and seems to be a design flaw. It is not proof of
anything in this case though. Why? Because an Queue might not
have the same size as an ImmutableQueue and your "proof" only
works when they are the same size.
>
> [...]
>> What I would say to you is, either try it on some examples, or
>> don't.
>
> I'm asking you for an example, because I don't see the point of
> it.
What kind of example? I have already given examples and proved
that there is a functional difference. I will not continue this
conversation because you refuse accept that. First you haven't
given your criteria for me to prove anything to you to satisfy
whatever it is you want. Second, I'm not here to waste my time
trying to prove the merits of the tool. Again, either use it if
you feel like it does something or don't. The method is not
flawed in and of itself. It works(if it didn't, someone would
have probably already shown it not to work).
All you can do is assert a negative, which you can't prove
yourself. So we end up chasing each other tails, which I refuse
to do. If you want more proof then it is up to you, not me. I
have my proof and it is good enough for me.
More information about the Digitalmars-d
mailing list