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

Head 함수와 유사하게 Arg 함수를 사용하여 Assign 함수의 자식에 액세스할 수 있습니다.
show( arg(E,1) );
인수(E, 1) = A; 왼쪽
show( arg(E,2) );
인수(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 assign 함수에는 두 개의 인수가 있습니다. 좌변과 우변
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 = halfCats / 2
JSL 목록은 같은 종류의 표현식입니다.
list={33,44,55};
show(head(list));
show(narg(list));
show(arg(list,3));
헤드(목록) = {}; 목록은 다음과 같은 이름 대신 머리에 중괄호를 표시합니다. 양수인
N Arg(목록) = 3;
인수(목록, 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);
"알파" < "브라보" < "찰리" < "델타" < "에코" < "폭스트롯" < "골프" < "호텔" <
"인도" < "줄리엣" < "킬로" < "리마" < "마이크" < "11월" < "오스카" < "파파" <
"퀘벡" < "로미오" < "시에라" < "탱고" < "유니폼" < "빅터" < "위스키" < "엑스레이" < "양키" < "줄루"
eval(words)
1 평가 (words)는 Less의 결과가 true임을 나타내는 1을 반환합니다.
또 다른 예.
2017년 2월 28일 업데이트 - 새 커뮤니티의 서식 복구
Craig, 이 기사는 표현을 다루는 방법을 이해하기 위한 계속적인 탐구에 매우 도움이 되었습니다.
목록의 항목을 Less() 함수의 인수로 바꾸는 마지막 트릭에 대해 실제로 좋은 응용 프로그램이 있었습니다. 대화 상자 창의 사용자 입력을 기반으로 Col Mean() 함수가 포함된 열 수식을 생성하고 싶었습니다. Col Means() 함수는 하나 이상의 인수를 취하며 다양한 수의 인수(종종 변수 이름)를 함수로 대체하는 매끄러운 방법을 본 적이 없습니다. 내 스크립트의 핵심 라인은 다음과 같습니다.
arglist = {"키", "나이", "성별"}; // 다이얼로그 창의 결과
statformula = 대체( arglist, Expr( {} ), Expr( Col Mean() ) ); // arglist의 항목은 Col Means() 함수의 인수가 됩니다.
newcol << 공식( 이름 Expr( statformula ) );
실제 스크립트는 Name(" ")이 필요한 지저분한 열 이름을 처리해야 하기 때문에 더 복잡하지만 아이디어는 알 수 있습니다. 이 깔끔한 트릭을 보여 주셔서 감사합니다.
하워드 라우치