Betreff: Frage zu type() einer mit expr() deklarierten VariableDie Hauptsache, die Sie beachten sollten, ist dies Drucken() , Schreiben() und Zeigen() behandeln ihre Argumente etwas anders als die meisten Funktionen – sie entpacken, werten sie aber nicht aus. Daher Drucken(c) werde das Ding drucken c ist - es ist ein Ausdruck. Typ() wird entpacken, dann sein Argument auswerten und dann seinen Typ zurückgeben. Falls Sie es wollen Typ() sich eher zu verhalten Drucken() , dann benutze Name Ausdruck () , als Typ( Name Ausdruck( c ) )
Betreff: Frage zu type() einer mit expr() deklarierten VariableDanke @ErraticAttach
Ich verstehe genau, was Sie erklären.
Ich habe jedoch eine Frage an Sie.
Ob Typ () wird dann entpackt und ausgewertet Ausdruck (a + b) wird im Fall 4 ausgewertet, sollte nicht Number als Rückgabewert von zurückgegeben werden Typ () wie in Fall 3?Unterscheidet sich die Verarbeitung beim Auswerten des Typs nach dem Entpacken, je nachdem, ob das Argument als Variable oder als Funktion angegeben ist?
Betreff: Frage zu type() einer mit expr() deklarierten VariableSprachen wie C und C++ werten Argumente für Funktionsaufrufe vor dem Aufruf aus. C und C++ haben keinen Ausdrucksdatentyp, da Ausdrücke zur Kompilierzeit in Code kompiliert werden. Schnellere Ausführung, schränkt jedoch einige der Möglichkeiten ein, wie Sie über die Lösung eines Problems nachdenken können.
JSL hat eine parse()-Funktion, die einen String nimmt und ihn in einen Ausdrucksbaum umwandelt. Die Funktion eval() wertet den Baum aus. Der Baum wird automatisch ausgewertet, wenn auf die rechte Seite einer Zuweisung zugegriffen wird, es sei denn, es wird besonders darauf geachtet, einen Blick darauf zu werfen.Es gibt eine nameExpr()-Funktion, die nur verwendet werden sollte, wenn Sie einen Blick auf den in einer Variablen gespeicherten Ausdruck werfen müssen, ohne ihn versehentlich auszuwerten. Aus irgendeinem Grund, der Zeit verloren hat und vielleicht zu spät ist, um ihn jetzt zu beheben, wurden print/show/write ohne den Aufruf geschrieben, ihre Argumente auszuwerten, wenn das Argument eine einfache Variable zu sein scheint. Ok, zu der Zeit schien es wahrscheinlich eine Beschleunigung zu sein, weil es einen gewissen Overhead gibt, um eval(c) vs. nur den Wert von c zu erhalten. Aber print(c+0) wertet das Argument aus, ebenso wie print(eval(c)), weil das Argument keine einfache Variable ist.
Betreff: Frage zu type() einer mit expr() deklarierten Variable@Craige_Hales ist sicherlich richtig - Auspacken ist kein guter Begriff, entschuldigen Sie die Verwirrung!Das Verhalten, das ich zu beschreiben versuchte, ist jedoch dokumentiert - überprüfen Sie diesen Link: https://www.jmp.com/support/help/en/15.2/index.shtml#page/jmp/expressions.shtml
Hier ist das relevante Bit:

Betreff: Frage zu type() einer mit expr() deklarierten VariableDANKE!! du warst sehr hilfreich! 
Betreff: Frage zu type() einer mit expr() deklarierten VariableVielen Dank! Sehr hilfreich geworden.
Betreff: Frage zu type() einer mit expr() deklarierten Variablea = 1;
b = 2;
type( a + b );
"Nummer"
Intern erhielt type einen Ausdrucksbaum, der wie add( a, b ) aussieht. Der Baum wird zu einer Zahl ausgewertet.
a = 1;
b = 2;
type( expr( a + b ) );
"Ausdruck"
Intern erhielt type einen Ausdrucksbaum, der wie expr( add( a, b ) ) aussieht. Auch hier wird der Baum ausgewertet; Der Knoten expr() im Baum gibt sein Argument als Ausdruck zurück.
a = 1;
b = 2;
c = expr( a + b );
type( c );
"Nummer"
Typ erhielt intern einen Ausdrucksbaum, der wie c aussieht. Auch hier wird ausgewertet. c ist ein Ausdruck, add(a,b), der die aktuellen Werte von a und b verwendet, wenn c ausgewertet wird.c hat KEINEN expr()-Knoten in seinem Baum.
"Auspacken" ist in JSL keine gut definierte Idee. Jede eingebaute Funktion sieht ihre Argumente zunächst als Ausdrucksbäume. Einige Funktionen werten ihre Argumente aus, ohne sie vorher anzusehen. Andere Funktionen werten sie nie aus. Einige Funktionen prüfen, ob der Wurzelknoten des Ausdrucks eval() oder expr() oder send() ist, und machen etwas anderes. (send() ist der <<-Operator. Es gibt eine unäre Verwendung in Argumentlisten, um spezielle Argumente zu identifizieren, oft tatsächliche Nachrichten, die an eine zu erstellende Anzeigebox gesendet werden.) Das Hinzufügen eines Formelausdrucks zu einer Spalte ist ein Beispiel, das mich manchmal aus der Fassung bringt; es geht davon aus, dass das Argument nicht ausgewertet werden sollte. Das Hinzufügen von eval() um die Formel bewirkt, dass sie eval wird, weil Formel(...) das Argument ansieht. Die Alternative wäre gewesen, das Argument immer auszuwerten, und dann würde der normale Anwendungsfall expr() um die Formel herum erfordern (weil die Auswertung von expr(...) nur sein Argument zurückgibt.)
Frage zum Typ() der mit expr() deklarierten VariablenHallo
Ich verwende „expr()“ und habe ein paar Fragen.
Ich werde Fragen entsprechend der in den Kommentaren angegebenen Anzahl stellen.
1) Kann davon ausgegangen werden, dass eval() angewendet wird, wenn c so ausgeführt wird, wie es ist?
2) -
3) Warum erscheint Number, wenn der Typ der als expr() deklarierten Variablen c überprüft wird?
Wenn type() das Argument ausführt, den Typ erkennt und das Ergebnis anzeigt, frage ich mich, warum es im Fall von 4) Ausdruck ist.
4) -
a = 1;
b = 2;
c = expr(a + b);
c; // 1) Result : 3
print(c); // 2) Result : a + b
type(c); // 3) Result : Number
type(expr(a + b)); // 4) Result : Expression
Danke 
Qualitäts- und VerfahrenstechnikBetreff: Frage zum Typ einer mit expr() deklarierten VariableEs ist interessant zu sehen, dass write je nach Art des Arguments unterschiedliche Dinge bewirkt.
Es gibt einige andere Funktionen, die das Gegenteil tun: Sie suchen einen einfachen Namen, werten aber KEINEN komplexeren Ausdruck aus.
Hat jemand eine vollständige Liste der Funktionen, die vor der Verwendung die Funktionen „nachschlagen“, „auspacken“, „auswerten“ usw. und deren Argumente ausführen ?
Wie viele Fälle müssen berücksichtigt werden?
Mir ist aufgefallen, dass es einige Sonderfälle gibt, z. B. „for each “, das prüft, ob das erste Argument eine Liste ist.
x= Expr(Print(2));
y = "hello";
Write(x); // ->Print(2)
Write(y || " world"); // hello world
Head(x); // Print()
Type(x); //-> 2
...