
Die Skriptsprache von JMP, JSL, ist aus Funktionsaufrufen aufgebaut. So ziemlich alles, was Sie in JSL schreiben können, ist ein Funktionsaufruf. Einige Dinge sehen nicht wie Funktionsaufrufe aus:
A = A + 3;
Es ist ziemlich offensichtlich, dass die rechte Seite der Zuweisungsanweisung ein Ausdruck ist. Es ist weniger offensichtlich, dass die Zuweisungsanweisung selbst ein Ausdruck ist.
E = expr ( A = A + 3 );
expr ist ein Wrapper, den Sie um einen Ausdruck herum verwenden können, um zu verhindern, dass der Ausdruck ausgewertet wird. E wird auf den Ausdruck gesetzt, nicht auf das ausgewertete Ergebnis des Ausdrucks. Um einen Blick auf E zu werfen, verwenden Sie die Kopffunktion. Head gibt den Namen der Funktion an der Wurzel des Ausdrucks zurück:
show( head(E) );
Kopf(E) = Zuweisen();
Jetzt sehen Sie, dass es eine Funktion zum Erstellen von Zuweisungen gibt:
Assign( testing, 3+4 );
7
show(testing)
Prüfung = 7;
Ausdrücke in JSL sind eigentlich Bäume. Hier ist ein Bild des a=a+3-Baums, Wurzel oben, Blätter unten:

Ähnlich wie bei der Head-Funktion können wir die Arg-Funktion verwenden, um auf die untergeordneten Elemente der Assign-Funktion zuzugreifen:
show( arg(E,1) );
Arg(E, 1) = A; die linke Seite
show( arg(E,2) );
Arg(E, 2) = A + 3; die rechte Seite
und tiefer graben,
show(head(arg(E,2)))
Head(Arg(E, 2)) = Add(); der Kopf der rechten Seite
show(arg(arg(E,2),1))
Arg(Arg(E, 2), 1) = A; die linke Seite des Plus
show(arg(arg(E,2),2))
Arg(Arg(E, 2), 2) = 3; die rechte Seite des Plus
Beachten Sie, wie die Verschachtelung der Klammern den Baum beschreibt. Dieser Baum hat nur binäre Splits. Es gibt eine Funktion, Narr , die die Anzahl der Kinder zurückgibt. Es gibt 0 für Blattknoten zurück.
narg(E)
2 Die Assign-Funktion hat zwei Argumente, die linke Seite und die rechte Seite
JMPs zum Die Anweisung ist ein Funktionsaufruf mit vier Argumenten. Beachten Sie die Kommas, die die Argumente trennen, genau wie bei jeder anderen Funktion.
halfCats = 1;
for( iCat = 1, iCat <= 10, iCat++,
halfCats = halfCats / 2;
write( iCat, " ", halfCats , "\!n" )
);
1 0,5
2 0,25
3 0,125
4 0,0625
5 0,03125
6 0,015625
7 0,0078125
8 0.00390625
9 0.001953125
10 0.0009765625
Es braucht drei Kommas, um vier Argumente zu trennen. In diesem zum -Anweisung besteht das vierte Argument aus zwei Anweisungen, getrennt durch ein Semikolon. Sehen Sie sich das vierte Argument an, um zu sehen, ob es sich tatsächlich auch um eine Funktion handelt:
Head(
Arg(
Expr(
For( iCat = 1, iCat <= 10, iCat++,
halfCats = halfCats / 2;
Write( iCat, " ", halfCats, "\!n" );
)
),
4 /* the fourth arg */
)
);
Kleber()
Kleber ist der Name der Funktion, die eine Folge von Anweisungen zusammenhält.Kleber Das erste Argument von ist die erste Anweisung usw.
Arg(
Arg(
Expr(
For( iCat = 1, iCat <= 10, iCat++,
halfCats = halfCats / 2;
Write( iCat, " ", halfCats, "\!n" );
)
),
4 /* the fourth arg is two statements, glued together */
),
1 /* the first arg is the first of the two glued statements */
);
halbeKatzen = halbeKatzen / 2
Eine JSL-Liste ist die gleiche Art von Ausdruck:
list={33,44,55};
show(head(list));
show(narg(list));
show(arg(list,3));
Kopf (Liste) = {}; list zeigt geschweifte Klammern für den Kopf anstelle eines Namens wie Zuordnen
NArg(Liste) = 3;
Arg(Liste, 3) = 55;
Wenn Sie nur den Inhalt der Liste möchten, sollten Sie die normale Subskription verwenden:
show(list[3]);
Liste[3] = 55;
Aber manchmal möchten Sie eine Liste in Argumente für eine Funktion umwandeln.
In dem Elefant post finden Sie ein Beispiel für die Umwandlung einer Liste in ein Muster (Zeile 5). Es fällt mir schwer, ein weiteres so cooles Beispiel zu finden, aber angenommen, Sie wollten überprüfen, ob die Liste alphabetisch geordnet ist. Der <-Operator von JMP kann dies in einem einzigen Funktionsaufruf tun:
LT = expr("a"<"b"<"c"<"d");
show(head(LT));
show(narg(LT));
Kopf (LT) = Weniger (); der Kleiner-als-Operator zeigt einen Funktionsnamen an, Weniger
NArg(LT) = 4;
Die Less-Funktion kann viele Argumente annehmen, aber Sie müssen sie nicht eingeben. Unter, Namensausdruck ruft den in Wörtern gespeicherten Ausdruck nach dem ab ErsatzInto modifiziert die { aufführen } sein Weniger (). JMP zeigt dann die Less-Funktion mit < an, um sie besser lesbar zu machen.
words =
{"Alpha", "Bravo", "Charlie", "Delta", "Echo", "Foxtrot", "Golf", "Hotel", "India",
"Juliet", "Kilo", "Lima", "Mike", "November", "Oscar", "Papa", "Quebec", "Romeo",
"Sierra", "Tango", "Uniform", "Victor", "Whiskey", "Xray", "Yankee", "Zulu"};
Substitute Into( words, Expr( {} ), Expr( Less() ) );
nameExpr(words);
„Alpha“ < „Bravo“ < „Charlie“ < „Delta“ < „Echo“ < „Foxtrott“ < „Golf“ < „Hotel“ <
„Indien“ < „Juliet“ < „Kilo“ < „Lima“ < „Mike“ < „November“ < „Oscar“ < „Papa“ <
„Quebec“ < „Romeo“ < „Sierra“ < „Tango“ < „Uniform“ < „Victor“ < „Whiskey“ < „Xray“ < "Yankee" < "Zulu"
eval(words)
1 auswerten (words) gibt 1 zurück, was anzeigt, dass das Ergebnis von Less wahr war.
Ein anderes Beispiel.
Update 28. Februar 2017 – Formatierung für neue Community reparieren
Craig, dieser Artikel war sehr hilfreich für mich bei meiner ständigen Suche nach dem Umgang mit Ausdrücken.
Ich hatte tatsächlich eine gute Anwendung für Ihren letzten Trick, bei dem Sie Elemente in einer Liste in Argumente der Funktion Less() umgewandelt haben. Ich wollte eine Spaltenformel generieren, die die Funktion Col Mean() enthält, basierend auf Benutzereingaben aus einem Dialogfenster. Die Funktion Col Means() nimmt ein oder mehrere Argumente entgegen, und ich hatte noch nie eine clevere Möglichkeit, eine unterschiedliche Anzahl von Argumenten (häufig Variablennamen) in einer Funktion einzusetzen. Hier sind die wichtigsten Zeilen in meinem Skript:
arglist = {"Höhe", "Alter", "Geschlecht"}; // Ergebnisse aus einem Dialogfenster
statformula = Substitute ( arglist, Ausdr( {} ), Ausdr( Col Mean() ) ); // Elemente in arglist werden zu Argumenten in der Funktion Col Means()
newcol << Formula( Name Expr( statformula ) );
Das eigentliche Skript ist komplexer, weil es mit unordentlichen Spaltennamen umgehen muss, die Name(" ") erfordern, aber Sie verstehen schon, was dahintersteckt. Danke, dass du mir diesen netten Trick gezeigt hast.
Howard Rauch