If-else in jmp (und ifmz)Ich weiß (jetzt ...), dass Sie IfMZ in JMP verwenden sollten, wenn die Möglichkeit besteht, dass ein Wert fehlt und Sie möchten, dass dieser als 0 ausgewertet wird. Ich frage mich, was im folgenden Beispiel passiert, wenn Sie eine if-Anweisung mit „zwei anderen“ haben (es wird kein Syntaxfehler zurückgegeben). Im Beispiel unten ist es Ausdruck if_expr_drei (und das Gleiche gilt für ifmz_expr_drei 
Names Default To Here(1);
if_expr_two = Expr(
res = If(val,
Print(Eval Insert("if_expr_two\!t^val^\!ttrue"));
1;
,
Print(Eval Insert("if_expr_two\!t^val^\!tfalse"));
0
);
show(res);
);
// what does this evaluate to and why does val = . return second statement
if_expr_three = Expr(
res = If(val,
Print(Eval Insert("if_expr_three\!t^val^\!ttrue"));
1;
,
Print(Eval Insert("if_expr_three\!t^val^\!tfalse?"));
0;
,
Print(Eval Insert("if_expr_three\!t^val^\!tsomething?"));
-1;
);
show(res);
);
ifmz_expr_two = Expr(
res = IfMZ(val,
Print(Eval Insert("ifmz_expr_two\!t^val^\!ttrue"));
1;
,
Print(Eval Insert("ifmz_expr_two\!t^val^\!tfalse"));
0;
);
show(res);
);
ifmz_expr_three = Expr(
res = IfMZ(val,
Print(Eval Insert("ifmz_expr_three\!t^val^\!ttrue"));
1;
,
Print(Eval Insert("ifmz_expr_three\!t^val^\!tfalse?"));
0;
,
Print(Eval Insert("ifmz_expr_three\!t^val^\!tsomething?"));
-1;
);
show(res);
);
val = 1;
if_expr_two; // OK, prints true and returns 1
if_expr_three; // OK?, prints true and returns 1
ifmz_expr_two; // OK, prints true and returns 1
ifmz_expr_three; // OK?, prints true and returns 1
Write("\!N");
val = 0;
if_expr_two; // OK, prints false and returns 0
if_expr_three; // ? prints false?, but returns missing
ifmz_expr_two; // OK, prints false and returns 0
ifmz_expr_three; // ? prints false?, but returns missing
Write("\!N");
val = .;
if_expr_two; // OK, no print but returns missing value
if_expr_three; // ? prints false? and returns missing
ifmz_expr_two; // OK, prints false and returns 0
ifmz_expr_three; // ? prints false? and returns missing
Write();
Ich werde höchstwahrscheinlich eine Frage dazu an den JMP-Support senden, möchte aber auch die JMP-Community um Meinungen bitten.
Dies ist ein etwas ähnlicher Fall wie Assoziative Arrays und Entfernung von Schlüsseln mit dem gleichen Wert wie dem Standardwert In diesem Sinne bin ich mir nicht sicher, warum das passiert (ich habe eine Nachricht darüber an den JMP-Support gesendet und warte immer noch auf die endgültige Antwort).
Automatisierung und SkripterstellungBetreff: If-else in jmp (und ifmz)Aus dem Skriptindex für die If()-Funktion ( Hervorhebung von mir):
Wertet das erste jedes Paares aus von Argumenten und gibt die Auswertung des Ergebnisausdrucks zurück, der dem ersten Bedingungsargument zugeordnet ist, das ein Ergebnis ungleich Null ergibt. Die Bedingungsargumente werden der Reihe nach ausgewertet. Wenn Alle Bedingungsargumente ergeben den Wert Null, das optionale elseResult wird ausgewertet und das Ergebnis zurückgegeben. Wenn kein elseResult ist spec Wenn ied und keine der Bedingungen erfüllt ist, wird ein fehlender Wert zurückgegeben. Wenn Wenn alle Bedingungsargumente als fehlend ausgewertet werden, wird ein fehlender Wert zurückgegeben.
Ich habe den Importteil fett gedruckt: „Bewertet das erste jedes Paares …“
Ein If() mit drei Kommas hat also zwei Paare. Bedenken Sie:
a=3;
If(
a==1, show("a==1"), //first pair - evaluate whether a==1
a==2, show("a==3") //second pair - evaluate whether a==2
);
Dass If() ein fehlendes Ergebnis zurückgibt, da es keinen Ausdruck „Erster jedes Paares“ gab, der einen Wert ungleich Null zurückgab.
In Ihrer If()-Funktion:
If(
val,Print(Eval Insert("if_expr_three\!t^val^\!ttrue")); 1;, // first pair - evaluate whether val is nonZero
//begin second pair
Print(Eval Insert("if_expr_three\!t^val^\!tfalse?"));0; ,
Print(Eval Insert("if_expr_three\!t^val^\!tsomething?"));-1;
// second pair -- evaluate Print(); 0; - that returns 0 (since that was the last value in the expression) - so the second condition isn't nozero
);
Denken Sie daran, dass JSL eine rein funktionale Sprache mit Operatoren ist, um die Lesbarkeit zu erleichtern, aber das ; ist der Operator für die Glue()-Funktion . Die Funktion Glue() gibt den letzten Ausdruck zurück, den sie auswertet.
Sehen: Der Unterschied zwischen Kleber und if