Wie in einer aktuellen post hingewiesen wurde, funktioniert das Scoping innerhalb des Moduls nicht wie erwartet.Warum würde Mathematica die normalen Scoping-Regeln in Module brechen?
Ein Beispiel aus diesem Thread ist:
Module[{expr},
expr = 2 z;
f[z_] = expr;
f[7]]
(*2 z*)
Aber die folgende funktioniert fast wie erwartet.
Module[{expr},
expr = 2 z;
[email protected]@{f[z_], expr};
f[7]]
(*14*)
Welchen Sprachentwurf berücksichtigte Wolfram, um diese Funktionalität zu wählen?
Edit: Siehe Jefromi ersten Kommentar Ich änderte z von einer lokalen Variable zu nicht und vergaß, die Ausgabe zu ändern. Es wirkt sich nicht auf das Problem aus.
Edit2: Michael Pilats Punkt scheint zu sein, dass Block und Modul unterschiedliche Funktionen haben. Ich denke, ich verstehe seinen Standpunkt, aber ich denke, dass es zu meiner Frage orthogonal ist. Also hier ist ein Update.
kann ich den folgenden Code an dem der globalen Ebene in einem Notebook verwenden:
expr = 2 z;
f[z_] = expr;
f[7]
(*output: 14*)
Aber wenn ich den gleichen Code-Block in ein Modul setzen und ausdr lokalen mache es erzeugt einen anderen Ausgang.
Clear[f];
Module[{expr},
expr = 2 z;
f[z_] = expr;
f[7]]
(*output: 2z*)
Wenn Sie die oben Modul Trace rufen Sie feststellen, dass Set [f [z_], ausdr] wird [f [z $ _, ausdr] auf neu geschrieben. Nun passiert diese Transformation z-> z $ sowohl auf der linken als auch auf der rechten Seite der Menge. Es passiert jedoch, bevor expr ausgewertet wird, was zu einem anderen Ergebnis führt als auf globaler Ebene.
Die Transformation z-> z $ scheint nur dann zu passieren, wenn die rhs ein lokales Symbol für den Modulaufruf hat.
Warum wählt Mathematica diese Syntaxänderung in einem Modulaufruf? Welche Kompromisse zwischen Sprache und Implementierung gibt es hier, die diese Entscheidung getroffen haben.
Welche Version von Mathematica verwenden Sie? Liefert das erste wirklich das lokale z ('z $ 1776') des Moduls statt nur' 2z' (was ich mit der Version 6.0.0 bekomme). – Cascabel
Oder ist das lokale z, das vom Muster erstellt wird, identisch? – Cascabel
Von Trace scheint es, dass Mathematica entscheidet, dass, weil es eine lokale Variable auf der RHS der Menge gibt, eine lokale Variable für das Muster verwendet wird ('f [z $ _] = expr $ 64'). In allen anderen Fällen kann ich mir vorstellen, dass wenn das RHS keine lokale Variable enthält, es das erwartete 'f [z_] = ...' verwendet. Vielleicht gibt es einen vernünftigen Fall von Evaluation, in dem dieses Verhalten Sinn macht, aber ich kann es mir nicht vorstellen. +1, und ich hoffe, dass jemand es schafft, zu antworten. – Cascabel