Wenn ich falsch liege, korrigieren Sie mich bitte, aber es scheint, dass JMP einen dynamischen Bereich ohne Bereichspersistenz hat (mit Ausnahme der Pseudo-Namespaces). Hier , Lokal , Fenster , Kasten ).Dies steht im Gegensatz zu vielen gängigen Programmiersprachen, die über einen lexikalischen Gültigkeitsbereich mit vollständiger Gültigkeitsbereichspersistenz unter Verwendung von Referenzzählern verfügen.
Das löste bei mir eine Menge Kopfzerbrechen aus, bis ich die nötige Intuition erlangte, um mit dem seltsamen Scope-System von JMP zu arbeiten, und ich glaube, dass es bei vielen Menschen für große Verwirrung sorgt.Nicht viele Programmiersprachen verwenden den dynamischen Bereich (LISP ist eine wichtige Ausnahme, und JSL weist einige Ähnlichkeiten mit LISP auf).
Ich möchte das JSL-Dokumentationsteam ermutigen, auf diesen Unterschied hinzuweisen und einige Ressourcen/Links zum besseren Verständnis des dynamischen Bereichs bereitzustellen, da dies sicherlich nicht die Standardmethode zur Namensauflösung ist.
Hier ist ein Beispiel: Der lokale Gültigkeitsbereich der äußeren Funktion wird unmittelbar nach der Return-Anweisung gelöscht, und die Namensauflösung der inneren Funktion erfolgt dynamisch (basierend auf dem aktuellen Aufrufstapel):
Names Default to Here( 1 );
x = 7;
outer function = Function( {},
{x},
x = 4;
inner function = Function( {},
Print( x )
);
Return( Name Expr( inner function ) );
);
func = outer function;
func()
//:*/
Names Default to Here( 1 );
x = 7;
outer function = Function( {},
{x},
x = 4;
inner function = Function( {},
Print( x )
);
Return( Expr( inner function ) );
);
func = outer function;
func()
/*:
7Wenn Sie in einer Sprache mit lexikalischem Geltungsbereich und Bereichspersistenz (wie Python) etwas funktional Äquivalentes tun, dann ist der umschließende Bereich der inneren Funktion persistent (es ist der lokale Bereich für die äußere Funktion) und die Namensauflösung für die innere Funktion Die x-Variable der Funktion ist der Wert 4 aus der lexikalischen Lesart des Systems.Da JMP keinen lexikalischen Bereich, sondern einen dynamischen Bereich verwendet, verwendet es, wenn die innere Funktion schließlich am Ende des Skripts ausgeführt wird, die dynamische Namensauflösung „Lokal -> Hier -> Global“ (und mögliche Spalten-) Namen für die aktuelle Tabelle) und findet den Wert 7.
Das Verständnis dieser Art von Verhalten ist für die Erstellung robuster Programme in JSL von entscheidender Bedeutung, und ich möchte nur jeden darauf hinweisen, der mit JSL lernt oder Probleme damit hat.
Lassen Sie mich wissen, wenn Sie irgendwelche Gedanken oder nicht intuitive Beispiele haben!