我知道(現在..)如果您有可能存在缺失值並且您希望將其評估為 0,您應該在 JMP 中使用 IfMZ。 我想知道下面的示例中發生了什麼,如果您有帶有“兩個 else”的 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 並返回結果。 如果沒有 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() 將返回缺失,因為沒有返回非零值的“每對中的第一個”表達式。
在您的 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的區別