Der folgende Code funktioniert nicht. B/c JSL wertet emptyVar aus, wenn Sie versuchen, es an die Funktion zu übergeben, anstatt es zur Laufzeit mit der Funktion auszuwerten.
isEmptyTest = Function({var},
return(isempty(var));
);
isEmptyTest(emptyVar);
Es wäre toll, wenn das geändert würde.
Ja, ich habe versucht, es für Fall 1 zu verwenden. Ich habe ein Tool erstellt, das eine Benutzerkonfigurationsdatei nutzt. Da Variablen aus der benutzerdefinierten Datei geladen werden, können sie vorhanden sein oder nicht und möglicherweise auf wahr/falsch gesetzt sein oder nicht. Ich hatte gehofft, einfach eine Wrapper-Funktion zu erstellen, die dies testet, bis mir klar wird, dass a eine „oder“-Anweisung ausführen kann, da sie beendet wird, sobald sie auf eine Wahrheit trifft.
if(isempty(var) | !var,
//run code)
);
Dies führt nicht zu einem Fehler, wenn die Variable noch nicht deklariert wurde. Es wird ein Truthy signalisiert und mit der Ausführung des Codes in der if-Anweisung fortgefahren, ohne die anderen Abhängigkeiten zu überprüfen. Wenn die Variable definiert wurde, kann ich prüfen, ob sie wahr ist oder nicht.
Eine Symboltabelle verfolgt alle jemals vorhandenen Variablen Satz auf einen Wert. Wenn eine Variable noch nie festgelegt wurde, ist sie nicht initialisiert und ihre Verwendung ist wahrscheinlich ein Fehler.
Das eingebaute ist leer() Funktion macht aus mehreren ungewöhnlichen Situationen Sonderfälle.
Fall 1 : Variable, die noch nie zuvor verwendet wurde
Is Empty(neverSeenBefore) = 1;
print(neverSeenBefore)
/*:
Name Unresolved: neverSeenBefore in access or evaluation of 'neverSeenBefore' , neverSeenBefore/*###*/
Name ungelöst bedeutet, dass JMP in der Symboltabelle gesucht und den Namen nicht gefunden hat.
Fall 2 (Normalfall): Variable wird auf den vom eingebauten Wert zurückgegebenen Wert gesetzt leer() Funktion oder eine andere Funktion, die empty() zurückgegeben hat
ev=empty(); show(isempty(ev),ev);
/*:
Is Empty(ev) = 1;
ev = Empty();
Wenn Sie einen Leertest durchführen möchten, sollten Sie Folgendes verwenden leer() Funktion zum Initialisieren Ihrer Variablen.
Fall 3 : Variable, die vom eingebauten gelöscht wurde Globals löschen() Funktion
ev2=42; clear globals(ev2); show(isempty(ev2),ev2);
Is Empty(ev2) = 1;
ev2 = ev2;
Benutzen Globals löschen() ist im Produktionscode keine gute Idee, kann aber bei der Codeentwicklung hilfreich sein. Das Symbol wird NICHT aus der Symboltabelle entfernt, sondern sein Wert, und es bleibt nicht einmal empty() für den Wert übrig. Je nachdem, wie es verwendet wird, kann es sich wie empty() verhalten oder fehlen.
JSL übergibt Argumente nach Wert an vom Benutzer geschriebene Funktionen und erstellt eine Kopie für die Verwendung durch die Funktion. Eine zukünftige Version von JMP ermöglicht möglicherweise die Übergabe von Argumenten per Referenz. Wir werden sehen, was an dieser Stelle passiert, wenn nicht initialisierte Variablen als Referenz übergeben werden.