我知道(现在..)如果您有可能存在缺失值并且希望将其评估为 0,则应在 JMP 中使用 IfMZ。 我想知道下面的例子中发生了什么,如果你有带有“两个其他”的 if 语句(不会返回语法错误)。 在下面的示例中,它是表达式if_expr_three (和同样的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();
我很可能会将有关此问题发送给 JMP 支持,但我也想在 JMP 社区征求意见。
这是一个有点类似的情况关联数组和删除值与默认值相同的键从这个意义上说,我不确定为什么会发生这种情况(我确实向 jmp 支持发送了有关此的消息,仍在等待最终答复)。
来自 If() 函数的脚本索引(强调我的):
评估每对中的第一个参数并返回与第一个条件参数关联的结果表达式的评估,该结果表达式的计算结果为非零结果。 条件参数按顺序求值。 如果所有条件参数的计算结果为零,计算可选的 elseResult 并返回结果。 如果没有其他结果是规范如果ied,并且所有条件都不为真,则返回缺失值。 如果所有条件参数的计算结果都为缺失,则返回缺失值。
我将重要部分加粗,“评估每对中的第一个……”
因此,带有三个逗号的 If() 有两对。 考虑一下:
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
);
If() 将返回 missing,因为没有返回非零值的“每对中的第一个”表达式。
在你的 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
);
请记住,JSL 是一种带有运算符的纯函数式语言,以使其更易于阅读,但是 ;是胶水()函数. Glue() 函数返回它计算的最后一个表达式。
看:胶水和if的区别