
JMP의 스크립팅 언어인 JSL은 함수 호출로 만들어졌습니다. JSL로 작성할 수 있는 거의 모든 것은 함수 호출입니다. 어떤 것들은 함수 호출처럼 보이지 않습니다:
A = A + 3;
대입문의 오른쪽이 표현식이라는 것은 꽤 명백합니다. 대입문 자체가 표현식이라는 것은 덜 명백합니다.
E = expr ( A = A + 3 );
expr은 표현식 평가를 방지하기 위해 표현식 주위에 사용할 수 있는 래퍼입니다. E는 표현식의 평가 결과가 아니라 표현식으로 설정됩니다. E를 살펴보려면 head 함수를 사용하십시오. Head는 식의 루트에서 함수 이름을 반환합니다.
show( head(E) );
헤드(E) = 할당();
이제 할당을 수행하는 기능이 있음을 알 수 있습니다.
Assign( testing, 3+4 );
7
show(testing)
테스트 = 7;
JSL의 표현식은 실제로 트리입니다. 다음은 a=a+3 트리의 그림입니다. 위쪽이 루트이고 아래쪽이 잎입니다.

Head 함수와 마찬가지로 Arg 함수를 사용하여 Assign 함수의 자식에 액세스할 수 있습니다.
show( arg(E,1) );
Arg(E, 1) = A; 왼쪽
show( arg(E,2) );
Arg(E, 2) = A + 3; 오른쪽
더 깊이 파고들고,
show(head(arg(E,2)))
헤드(Arg(E, 2)) = 추가(); 오른쪽의 머리
show(arg(arg(E,2),1))
Arg(Arg(E, 2), 1) = A; 플러스의 왼쪽
show(arg(arg(E,2),2))
Arg(Arg(E, 2), 2) = 3; 플러스의 오른쪽
괄호 중첩이 트리를 어떻게 설명하는지 주목하십시오. 이 트리에는 이진 분할만 있습니다. 기능이 있고, 나그 , 자식 수를 반환합니다. 리프 노드에 대해 0을 반환합니다.
narg(E)
2 할당 함수에는 왼쪽과 오른쪽의 두 인수가 있습니다.
JMP의 ~을 위한 statement는 4개의 인수를 사용하는 함수 호출입니다. 다른 함수와 마찬가지로 인수를 구분하는 쉼표에 주목하십시오.
halfCats = 1;
for( iCat = 1, iCat <= 10, iCat++,
halfCats = halfCats / 2;
write( iCat, " ", halfCats , "\!n" )
);
1 0.5
2 0.25
3 0.125
4 0.0625
5 0.03125
6 0.015625
7 0.0078125
8 0.00390625
9 0.001953125
10 0.0009765625
네 개의 인수를 구분하려면 세 개의 쉼표가 필요합니다. 이에 ~을 위한 명령문에서 네 번째 인수는 세미콜론으로 구분된 두 개의 명령문입니다. 네 번째 인수를 들여다보고 실제로 함수인지 확인합니다.
Head(
Arg(
Expr(
For( iCat = 1, iCat <= 10, iCat++,
halfCats = halfCats / 2;
Write( iCat, " ", halfCats, "\!n" );
)
),
4 /* the fourth arg */
)
);
접착제()
접착제 명령문 시퀀스를 함께 보유하는 함수의 이름입니다.접착제 의 첫 번째 인수는 첫 번째 진술 등입니다.
Arg(
Arg(
Expr(
For( iCat = 1, iCat <= 10, iCat++,
halfCats = halfCats / 2;
Write( iCat, " ", halfCats, "\!n" );
)
),
4 /* the fourth arg is two statements, glued together */
),
1 /* the first arg is the first of the two glued statements */
);
halfCats = 하프캣 / 2
JSL 목록은 같은 종류의 표현식입니다.
list={33,44,55};
show(head(list));
show(narg(list));
show(arg(list,3));
헤드(목록) = {}; 목록은 다음과 같은 이름이 아니라 머리에 중괄호를 표시합니다. 양수인
N Arg(목록) = 3;
Arg(목록, 3) = 55;
목록의 내용만 원하는 경우 일반 첨자를 사용해야 합니다.
show(list[3]);
목록[3] = 55;
그러나 때로는 목록을 함수의 인수로 바꾸는 것과 같은 작업을 원할 수 있습니다.
에서 코끼리 게시물에서 목록을 패턴으로 바꾸는 예를 찾을 수 있습니다(5행). 나는 그것만큼 멋진 다른 예를 제시하는 데 어려움을 겪고 있지만 목록이 알파벳 순서로 되어 있는지 확인하고 싶다고 가정합니다. JMP의 < 연산자는 단일 함수 호출에서 이를 수행할 수 있습니다.
LT = expr("a"<"b"<"c"<"d");
show(head(LT));
show(narg(LT));
헤드(LT) = 덜(); 보다 작음 연산자는 함수 이름을 표시합니다. 더 적은
N Arg(LT) = 4;
Less 함수는 많은 인수를 사용할 수 있지만 입력할 필요는 없습니다. 아래에, NameExpr 단어로 저장된 표현식을 검색하고 있습니다. 대체 수정 { 목록 } 장차 ~ 가 되는 더 적은 (). 그런 다음 JMP는 읽기 쉽도록 <를 사용하여 Less 함수를 표시합니다.
words =
{"Alpha", "Bravo", "Charlie", "Delta", "Echo", "Foxtrot", "Golf", "Hotel", "India",
"Juliet", "Kilo", "Lima", "Mike", "November", "Oscar", "Papa", "Quebec", "Romeo",
"Sierra", "Tango", "Uniform", "Victor", "Whiskey", "Xray", "Yankee", "Zulu"};
Substitute Into( words, Expr( {} ), Expr( Less() ) );
nameExpr(words);
"알파" < "브라보" < "찰리" < "델타" < "에코" < "폭스트롯" < "골프" < "호텔" <
"인도" < "줄리엣" < "킬로" < "리마" < "마이크" < "노벰버" < "오스카" < "파파" <
"퀘벡" < "로미오" < "시에라" < "탱고" < "유니폼" < "빅터" < "위스키" < "엑스레이" < "양키" < "줄루"
eval(words)
1 평가 (words)는 Less의 결과가 참임을 나타내는 1을 반환합니다.
다른 예시.
2017년 2월 28일 업데이트 - 새 커뮤니티의 서식 복구
크레이그, 이 기사는 표현을 다루는 방법을 이해하기 위한 나의 지속적인 탐구에 매우 도움이 되었습니다.
나는 실제로 목록의 항목을 Less() 함수의 인수로 바꾸는 마지막 트릭에 대한 좋은 응용 프로그램을 가지고 있습니다. 대화 상자 창의 사용자 입력을 기반으로 Col Mean() 함수를 포함하는 열 수식을 생성하고 싶었습니다. Col Means() 함수는 하나 이상의 인수를 사용하며 다양한 수의 인수(종종 변수 이름)를 함수로 대체하는 매끄러운 방법을 본 적이 없습니다. 내 스크립트의 핵심 라인은 다음과 같습니다.
arglist = {"신장", "나이", "성별"}; // 대화창의 결과
statformula = 대체( arglist, Expr( {} ), Expr( Col Mean() ) ); // arglist의 항목은 Col Means() 함수의 인수가 됩니다.
newcol << Formula( Name Expr( statformula ) );
실제 스크립트는 Name(" ")이 필요한 지저분한 열 이름을 처리해야 하기 때문에 더 복잡하지만 아이디어를 얻습니다. 이 깔끔한 트릭을 보여 주셔서 감사합니다.
하워드 라우치