jmp(およびifmz)のif-else私は(今..)値が欠落している可能性があり、それを0と評価したい場合は、JMPでIfMZを使用する必要があることを知っています。 「他の2つ」を含む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()関数のスクリプトインデックスから(強調鉱山):
各ペアの最初のペアを評価します引数の数を増やし、ゼロ以外の結果に評価される最初の条件引数に関連付けられた結果式の評価を返します。 条件引数は順番に評価されます。 もしもすべての条件引数がゼロと評価され、オプションの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の違い