Ich lese Harpers Intro zu SML und bin ein wenig verwirrt auf Referenzzellen. Auf P. 114, er das folgende Beispiel gibt:Standard-ML: Verwirrung über Referenzzellen
val r = ref 0
val s = ref 0
val _ = r := 3
val x = !s + !r
val t = r
val _ = t := 5
val y = !s + !r
val z = !t !r
„Nach der Ausführung dieser Bindungen, x bis 3 gebunden ist, wird y bis 5 gebunden ist, und Z gebunden ist, bis 10.“
Hier ist meine Spur seines Code:
val r = ref 0 //allocates storage for r and sets to 0
val s = ref 0 //allocates storage for s and sets to 0
val _ = r := 3 //sets r = 3
val x = !s + !r //sets x = 0 + 3 = 3
val t = r //sets t = 3
val _ = t := 5 //sets t = 5
val y = !s + !r //sets y = 0 + 3 = 3
val z = !t !r //sets z = 5 + 3 = 8
My x korrekt ist (3), aber meine y und z beide falsch (mein y 3 statt 5 und meine z 5 statt 10).
Wohin gehe ich hier falsch?
Auch warum ist val _ = t := 5
anstelle von einfach t := 5
erforderlich?
Danke, bclayman
Also wenn ich val t = r, und dann t: = 5, ändert sich das auch r? Das scheint sehr seltsam zu sein ... wenn ich r auf 5 ändere, würde ich erwarten, dass ich auch auf 5 umstelle. Aber nicht umgekehrt :( – bclayman
* Weder * t noch r ändern sich, wenn der Ausdruck 't: = 5' ausgewertet wird. Beide bleiben Referenzen auf eine bestimmte Stelle im Speicher. Die Auswertung dieses Ausdrucks hat den Nebeneffekt, den Inhalt davon zu ändern Natürlich verweist r jetzt auf diesen neuen Wert - aber nicht, weil r selbst verändert wurde. Eine Analogie: Wenn ich auf einen Hund deute und auf genau denselben Hund ziele, sage ich diesem Hund, er solle "sitzen" "(und es tut), Sie würden auf einen sitzenden Hund zeigen - aber nicht, weil ich Sie irgendwie geändert habe. –