jmp(및 ifmz)의 If-else나는 (지금..) 결측값이 있을 가능성이 있고 값을 0으로 평가하고 싶다면 JMP에서 IfMZ를 사용해야 한다는 것을 알고 있습니다. "two 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이 아닌 결과로 평가되는 첫 번째 조건 인수와 연결된 결과 표현식의 평가를 반환합니다. 조건 인수는 순서대로 평가됩니다. 만약에 모든 조건 인수는 0으로 평가되고 선택적 elseResult가 평가되고 결과가 반환됩니다. 만약에 elseResult가 사양입니다. 만약 ied이고 조건 중 어느 것도 참이 아니면 누락된 값이 반환됩니다. 만약에 모든 조건 인수가 누락된 것으로 평가되면 누락된 값이 반환됩니다.
가져오기 부분을 굵게 표시했습니다. "Evaluates the first of each pair..."
따라서 세 개의 쉼표가 있는 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()는 0이 아닌 값을 반환하는 "각 쌍의 첫 번째" 식이 없기 때문에 누락된 값을 반환합니다.
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() 함수는 평가한 마지막 표현식을 반환합니다.
보다: 접착제와 경우의 차이점