set!

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

set!
(let ((x 0) (y 1))
(set! x y) (set! y x)
(list x y))

kann jemand mir erklären, warum kommt (1 1) aus?
danke!!


x zeigt wegen set! auf y und das ist 1… hat also zuerst den wert 1.
dann zeigt y auf x wegen set! y x und da x 1 ist, ist y auch 1.


danke! Dann was ist mit
((set! x 0) (set! y 1)
(let ((x y) (y x))
(list x y)))
(1 0) oder?


Da tritt ein Fehler auf, insofern du x und y nicht vorher denifiert hast.

Das set! verändert den inhalt des Speicherplatzes, den der Scheme-Interpreter intern mit der Variablen verbunden hat.
Das heißt, wenn du vorher ein (define x -4) (define y -4) machst (oder sonst welche Werte, bzw. noch ein let-Block außenrum), so kriegst du als Ergebnis:
(1 0),
da vor dem let x = 0 und y = 1 gesetzt werden. Danach wird im let
x der Wert des äußeren y, also 1 und dem y im let der Wert des äußeren x, also 0 zugewiesen. Somit ist x = 1 und y = 0 innerhalb des let.


danke!
((lambda (a b) (set! + ) (set! * +) (+ a ( b a))) 2 3)
ergibt 12 statt 10, warum?


Weil du mit dem ersten set! alle + auf * setzt, somit auch die folgende set! Funktion nicht (set! * +) mehr heißt, sondern (set! * ) und dann, nur mit * gerechnet wird. ( a (* b a)) gibt 12.


alles klar, danke sehr!


Aus dem gleichen Grund wie oben.

Du gibst ‘+’ die Bedeutung von ‘’ und dann setzt du die
Bedeutung von ‘+’ (die jetzt * ist) wieder auf '
’.
Damit kriegst du (* 2 (* 2 3))

huch zu spaet, warum gibts hier aber auch keine mutex g


bei mir kommt da immer 8 raus (egal ob ich nur 1 set! von den beiden hab oder nicht). das ist bei mir so als haette set! NULL auswirkung auf operatoren

EDIT: das ist nur bei stklos so bei mir, habs grad mit drscheme probiert da kommt wie die anderen vor mir schon gesagt haben 12 raus


hm, is stklos doof?


Ich hatte am Anfang ein Probleme mit der stklos Version 0.5, nachdem ich die 0.7 compiliert und installiert hatte, war dieses Problem weg.
Ob auch diesea Problem daran liegt an der Version liegt?.

Ich verwende der besseren Bedienbarkeit halber jedenfalls DrScheme.


stklos folgt in diesem Punkt nicht dem scheme-Standard, welcher Operatoren nicht davor schuetzt, umdefiniert zu werden.