Es gibt etwas, was wir in einigen Antworten wiederholen, die meiner Meinung nach weitere Klärung verdienen. Wir sagen Bewertung läuft von links nach rechts. Richtig, aber die eigentliche Semantik der Nachrichten lautet:
Zuerst werten Sie den Empfänger aus, dann die Argumente in Reihenfolge; endlich die Nachricht senden.
Da die Smalltalk VM basierte stapeln, so bedeutet dies, dass Regel:
- Der Empfänger zuerst ausgewertet wird und das Ergebnis wird auf dem Stapel abgelegt.
- Die Argumente werden in der Reihenfolge ausgewertet und ihre Ergebnisse auf den Stapel geschoben. wird
- Die Meldung
Punkt 3 bedeutet, dass das Verfahren, das die Sende ruft den Empfänger und die Argumente in dem Stapel in der Reihenfolge oben definiert hat gesendet.
Zum Beispiel in
a := 1.
b := 2.
b := a - (a := b)
Variable b
wird (1 - (a := 2)) = -1
und a
-2
bewerten. Warum? Weil zu der Zeit, zu der die Zuweisung a := b
ausgewertet wird, wurde der Empfänger a
der Subtraktion bereits mit dem Wert, den er zu dieser Zeit hatte, d. H. 1
gedrückt.
Beachten Sie auch, dass diese Semantik beibehalten werden muss, auch wenn die VM Register anstelle des Stapels verwendet. Der Grund ist, dass Bewertungen die Semantik und damit die Reihenfolge bewahren müssen. Diese Tatsache wirkt sich auf die Optimierungen aus, die der systemeigene Code möglicherweise implementiert.
Es ist interessant zu beobachten, dass diese Semantik zusammen mit der Priorität unary> binary> Schlüsselwort Polymorphismus in einer einfachen Art und Weise unterstützt. Eine Sprache, die beispielsweise *
als +
mehr Vorrang gibt, geht davon aus, dass *
eine Multiplikation und +
ein Zusatz ist. In Smalltalk ist es jedoch Sache des Programmierers, die Bedeutung dieser (und anderer) Selektoren zu bestimmen, ohne dass die Syntax der eigentlichen Semantik im Wege steht.
Mein Punkt hier ist, dass "von links nach rechts" von der Tatsache kommt, dass wir Smalltalk auf Englisch schreiben, die von "links nach rechts" gelesen wird. Wenn wir Smalltalk mit einer Sprache implementieren, die von "rechts nach links" gelesen wird, würde diese Regel widerlegt werden. Die tatsächliche Definition, die wird unverändert bleiben, ist die eine in den Punkten 1, 2 und 3 oben ausgedrückt, die aus dem Stapel Metapher kommt.
'char = 0 boolean = char ~ = 0 & char ~ = 256' ist kein gültiger Smalltalk-Ausdruck (ich meine, es ist gültig, aber Ganzzahlen implementieren nicht' # boolean' AFAIK). Kannst du deiner Frage auch einen exakten Ausdruck geben, damit sie leichter zu verstehen ist? – Uko
Berücksichtigen Sie die Tatsache, dass Sie _messages_ und nicht _operators_ verwenden? I.e. 'boolean = char ~ = 256 & char ~ = 0' ist äquivalent zu' (((boolean = char) ~ = 256) & char) ~ = 0'. – Uko
Wie kann ich diese Auswertung richtig machen? – patzi