jmp (および ifmz) の if-else(今では) 欠損値がある可能性があり、それを 0 として評価したい場合は、JMP で IfMZ を使用する必要があることを知っています。 私が疑問に思っているのは、「2つの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サポートにメッセージを送信しましたが、まだ最終的な回答を待っています)。
自動化とスクリプト作成Re: jmp (および ifmz) の If-elseIf() 関数のスクリプト索引から (強調は私です):
各ペアの最初のペアを評価します引数の値を返し、ゼロ以外の結果に評価される最初の条件引数に関連付けられた結果式の評価を返します。 条件引数は順番に評価されます。 もしもすべての条件引数が 0 に評価され、オプションの elseResult が評価され、結果が返されます。 もしもelseResult は仕様ですもしもied で、どの条件にも当てはまらない場合は、欠損値が返されます。 もしもすべての条件引数が欠損と評価されると、欠損値が返されます。
インポート部分「各ペアの最初を評価する...」を太字にしました。
したがって、カンマが 3 つある If() には 2 つのペアがあります。 このことを考慮:
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() 関数。 Glue() 関数は、評価した最後の式を返します。
見る:接着剤とifの違い