If-else en jmp (y ifmz)Sé (ahora ...) que si tiene la posibilidad de tener un valor faltante y desea que se evalúe como 0, debe usar IfMZ en JMP. Lo que me pregunto es qué está sucediendo en el siguiente ejemplo, si tiene una declaración if con "dos más" (no devolverá un error de sintaxis). En el siguiente ejemplo es expresión si_expr_tres (y lo mismo para ifmz_expr_tres 
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();
Lo más probable es que envíe una pregunta sobre esto al soporte de JMP, pero también quiero pedir opiniones en la comunidad de JMP.
Este es un caso un poco similar a Matrices asociativas y eliminación de claves con el mismo valor que el valor predeterminado en ese sentido, no estoy seguro de por qué sucede esto (envié un mensaje al respecto al soporte de jmp, aún estoy esperando la respuesta final).
Automatización y secuencias de comandosRe: If-else en jmp (y ifmz)Desde el índice de secuencias de comandos para la función If() ( énfasis mío):
Evalúa el primero de cada par. de argumentos y devuelve la evaluación de la expresión de resultado asociada con el primer argumento de condición que se evalúa como un resultado distinto de cero. Los argumentos de condición se evalúan en orden. Si todos los argumentos de la condición se evalúan como cero, se evalúa el elseResult opcional y se devuelve el resultado. Si ningún otro resultado es especificación si ied, y ninguna de las condiciones es verdadera, se devuelve un valor faltante. Si todos los argumentos de condición se evalúan como perdidos, se devuelve un valor perdido.
Puse en negrita la parte de importación, "Evalúa el primero de cada par..."
Entonces, un If() con tres comas tiene dos pares. Considera esto:
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
);
Ese If () volverá a faltar porque no había una expresión "primero de cada par" que devolviera un valor distinto de cero.
En su función 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
);
Recuerda que JSL es un lenguaje puramente funcional con operadores para facilitar la lectura pero el ; es el operador de la Función de pegamento () . La función Glue() devuelve la última expresión que evalúa.
Ver: La diferencia entre pegamento y si