If-else in jmp (und ifmz)Ich weiß (jetzt ...), dass Sie IfMZ in JMP verwenden sollten, wenn Sie die Möglichkeit haben, einen fehlenden Wert zu haben, und Sie möchten, dass er als 0 bewertet wird. Was ich mich frage, was im folgenden Beispiel passiert, wenn Sie eine if-Anweisung mit "zwei anderen" haben (gibt keinen Syntaxfehler zurück). Im Beispiel unten ist es Ausdruck if_expr_three (und dasselbe für ifmz_expr_three 
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, aber ich möchte auch um Meinungen in der JMP-Community bitten.
Dies ist ein bisschen ähnlicher Fall wie Assoziative Arrays und Entfernen von Schlüsseln mit gleichem Wert wie Standardwert In diesem Sinne bin ich mir nicht sicher, warum dies geschieht (ich habe eine Nachricht darüber an den JMP-Support gesendet und warte immer noch auf die endgültige Antwort).
SkripterstellungBetreff: If-else in jmp (und ifmz)Aus dem Skriptindex für die If()-Funktion ( Betonung von mir) :
Wertet den ersten jedes Paares aus von Argumenten und gibt die Auswertung des Ergebnisausdrucks zurück, der dem ersten Bedingungsargument zugeordnet ist, das zu einem Ergebnis ungleich Null ausgewertet wird. Die Bedingungsargumente werden der Reihe nach ausgewertet. Wenn Alle Bedingungsargumente werden zu Null ausgewertet, das optionale elseResult wird ausgewertet und das Ergebnis zurückgegeben. Wenn no elseResult ist Spezifikation wenn ied und keine der Bedingungen wahr ist, wird ein fehlender Wert zurückgegeben. Wenn alle Bedingungsargumente als fehlend ausgewertet werden, wird ein fehlender Wert zurückgegeben.
Ich habe den Importteil fett gedruckt, "wertet das erste jedes Paares aus ..."
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() wird fehlend zurückgeben, da es keinen Ausdruck "Erster von jedem Paar" 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 das Lesen zu erleichtern, aber die ; ist der Operator für die Glue()-Funktion . Die Glue()-Funktion gibt den letzten Ausdruck zurück, den sie auswertet.
Sehen: Der Unterschied zwischen Kleber und if