
Die Skriptsprache von JMP, JSL, basiert auf Funktionsaufrufen. So ziemlich alles, was Sie in JSL schreiben können, ist ein Funktionsaufruf. Manche 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) );
Head(E) = Assign();
Nun sehen Sie, dass es eine Funktion zum Erstellen von Zuweisungen gibt:
Assign( testing, 3+4 );
7
show(testing)
testen = 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 die 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; der linken 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 Pluszeichens
show(arg(arg(E,2),2))
Arg(Arg(E, 2), 2) = 3; die rechte Seite des Pluszeichens
Beachten Sie, wie die Verschachtelung der Klammern den Baum beschreibt. Dieser Baum hat nur binäre Aufteilungen. Es gibt eine Funktion, narg , das gibt die Anzahl der Kinder zurück. Für Blattknoten wird 0 zurückgegeben.
narg(E)
2 Die Zuweisungsfunktion hat zwei Argumente, die linke Seite und die rechte Seite
JMPs für 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
Zur Trennung von vier Argumenten sind drei Kommas erforderlich. In diesem für Das vierte Argument besteht aus zwei Anweisungen, die durch ein Semikolon getrennt sind. Schauen Sie sich das vierte Argument an, um zu sehen, ob es tatsächlich auch eine Funktion ist:
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 ist die erste Aussage 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 */
);
halfCats = halfCats / 2
Eine JSL-Liste ist ein Ausdruck derselben Art:
list={33,44,55};
show(head(list));
show(narg(list));
show(arg(list,3));
Head(list) = {}; list zeigt geschweifte Klammern für den Kopf an, statt eines Namens wie Zuordnen
N Arg(list) = 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 beispielsweise eine Liste in Argumente für eine Funktion umwandeln.
Im Elefant Im Beitrag 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 wie dieses zu finden, aber nehmen wir an, Sie möchten ü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
N Arg(LT) = 4;
Die Less-Funktion kann viele Argumente annehmen, Sie müssen diese jedoch nicht eingeben. Unter, NameExpr ruft den in Wörtern gespeicherten Ausdruck nach dem ab SubstituteInto hat das { geändert Liste } 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“ < „Foxtrot“ < „Golf“ < „Hotel“ <
„Indien“ < „Juliet“ < „Kilo“ < „Lima“ < „Mike“ < „November“ < „Oscar“ < „Papa“ <
„Quebec“ < „Romeo“ < „Sierra“ < „Tango“ < „Uniform“ < „Victor“ < „Whiskey“ < „Xray“ < „Yankee“ < „Zulu“
eval(words)
1 evalu (Wörter) gibt 1 zurück, was darauf hinweist, dass das Ergebnis von Less wahr war.
Ein anderes Beispiel.
Update 28. Februar 2017 – Formatierung für neue Community reparieren
Craig, dieser Artikel hat mir bei meiner weiteren Suche nach dem Umgang mit Ausdrücken sehr geholfen.
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()“ benötigt ein oder mehrere Argumente, und ich hatte noch nie eine raffinierte Möglichkeit, eine unterschiedliche Anzahl von Argumenten (häufig Variablennamen) in einer Funktion zu ersetzen. Hier sind die wichtigsten Zeilen in meinem Skript:
arglist = {"height", "age", "sex"}; // ergibt sich aus einem Dialogfenster
statformula = Substitute ( arglist, Expr( {} ), Expr( Col Mean() ) ); // Elemente in arglist werden zu Argumenten in der Funktion Col Means()
newcol << Formula( Name Expr( statformula ) );
Das eigentliche Skript ist komplexer, da es sich mit chaotischen Spaltennamen befassen muss, die Name(" ") erfordern, aber Sie verstehen, worauf es ankommt. Danke, dass du mir diesen tollen Trick gezeigt hast.
Howard Rauch