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