If-else dans jmp (et ifmz)Je sais (maintenant ..) que si vous avez la possibilité d'avoir une valeur manquante et que vous souhaitez qu'elle soit évaluée comme 0, vous devez utiliser IfMZ dans JMP. Ce que je me demande ce qui se passe dans l'exemple ci-dessous, si vous avez une instruction if avec "deux autres" (ne renverra pas d'erreur de syntaxe). Dans l'exemple ci-dessous, il s'agit de l'expression si_expr_trois (et pareil pour ifmz_expr_trois 
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();
J'enverrai très probablement une question à ce sujet au support JMP, mais je souhaite également demander l'avis de la communauté JMP.
C'est un cas un peu similaire à Tableaux associatifs et suppression des clés avec la même valeur que la valeur par défaut en ce sens, je ne sais pas pourquoi cela se produit (j'ai envoyé un message à ce sujet au support jmp, en attendant toujours la réponse finale).
Automatisation et scriptRe: If-else dans jmp (et ifmz)À partir de l'index de script pour la fonction If() ( c'est moi qui souligne) :
Évalue le premier de chaque paire d'arguments et renvoie l'évaluation de l'expression de résultat associée au premier argument de condition qui donne un résultat différent de zéro. Les arguments de condition sont évalués dans l'ordre. Si tous les arguments de condition sont évalués à zéro, l'option elseResult est évaluée et le résultat est renvoyé. Si no elseResult is spec si ied, et qu'aucune des conditions n'est vraie, une valeur manquante est renvoyée. Si tous les arguments de condition sont évalués comme manquants, une valeur manquante est renvoyée.
J'ai mis en gras la partie d'importation, "Évalue le premier de chaque paire..."
Ainsi, un If() avec trois virgules a deux paires. Considère ceci:
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
);
Cet If() renverra manquant car il n'y avait pas d'expression "première de chaque paire" qui renvoyait une valeur différente de zéro.
Dans votre fonction If() :
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
);
Rappelez-vous que JSL est un langage purement fonctionnel avec des opérateurs pour faciliter la lecture mais le ; est l'opérateur pour le Fonction Glue() . La fonction Glue() renvoie la dernière expression qu'elle évalue.
Voir: La différence entre la colle et si