Re: JSL 함수의 변수 동작gzmorgan, 통찰력 주셔서 감사합니다. 현재 window() 솔루션은 가장 간단한 솔루션인 것처럼 보였지만 저에게는 작동하지 않았습니다. 적어도 코딩을 시도한 방식은 아닙니다. 대부분의 변수에 대해 주로 eval sub() 명령을 사용하려고 했습니다. 작동하지만 nw(내 새 창 변수) 또는 현재 창의 _cw에 대해서는 작동하지 않습니다. 방금 뭔가를 놓친 것 같지만 괜찮습니다.
결국 Vince가 이전에 제안한 다른 제안인 창 네임스페이스로 돌아가게 되었습니다. 지금까지 문제가 없었습니다.
응용 프로그램 빌더에 관해서는 알고 있지만 사용하지는 않았습니다. 나는 일반적으로 내 자신의 GUI와 기능을 코딩하고 추가 기능을 수동으로 만듭니다. 나는 set 함수와 this(또는 self)와 무엇이 무엇을 호출하는지 이해하는 데 어려움을 겪었지만 이제 알 것 같습니다... 좀 더 자세히 살펴보겠습니다.
입력해 주셔서 감사합니다. 다양한 접근 방식 / 제안에 정말 감사드립니다. 내 스크립트는 일련의 관련 매개변수를 사용하여 몇 가지 다른 방식으로 표시하지만 설정하고 수동으로 매개변수를 클릭한 다음 내보내는 데 몇 분 정도 걸립니다. 이러한 업데이트와 마스터 파일의 반복을 통해 GUI 대신 별도의 호출 스크립트에서 스크립트를 호출할 수 있으며 하나의 플롯 세트가 아닌 N개의 플롯을 생성하도록 할 수 있습니다. 예전에는 몇 시간이 걸렸지만 지금은 10초입니다.couse 여기까지 오는데 오랜 시간이 걸렸지만 이것을 몇 년 동안 재사용할 수 있습니다.
Re: JSL 함수의 변수 동작이런!"this" 및 창 네임스페이스 대신 현재 창을 참조할 수도 있습니다.대체 스크립트를 첨부했는데,
Re: JSL 함수의 변수 동작좋은 제안인 Window Namespace를 사용하도록 제안하려고 했습니다.나는 일반적으로 UI 창에 기능을 사용하지 않습니다.로컬 개체를 참조하는 또 다른 방법은 Set 함수를 사용하고 이에 대한 핸들을 얻는 것입니다. 스크립트는 다음과 같습니다.더 간단한 인쇄 문을 사용했습니다.Application Builder를 사용하여 탐색하고 싶을 수 있습니다. 작동 방식을 배우려면 약간의 투자가 필요하지만 편리할 수 있습니다.
names default to here(1);
myFun = Function({A, Z},{Default Local},
A[2] = 10;
B = 2*A;
show (A);
show(B);
show(Z);
nw = new window("test",
vlistbox(
textbox(Z),
textbox(char(B)),
buttonbox("Show array B (works)",
<<SET function=""></SET>Re: JSL 함수의 변수 동작고마워 빈스. 나는 윈도우 네임스페이스에 대해 몰랐다. 잘 작동할 수 있습니다. 시도해 보겠습니다.
지금은 하나의 파일에 내 GUI 부분이 있고 변수를 내가 메인 함수라고 부르는 것에 전달하려고 합니다. 추가 기능 도구 모음에서 GUI를 호출하거나 N번 반복되는 작은 사용자 지정 스크립트를 실행하여 N 세트의 입력 매개변수에 대한 기본 스크립트를 호출합니다. 여기서 재사용 가능성이 문제가 될 수 있지만 변수를 덮어쓰는 것은 중요하지 않을 수 있습니다... 어떻게 되는지 보겠습니다. 당신의 도움을 주셔서 감사합니다.
Re: JSL 함수의 변수 동작전역 또는 전역 이름 공간으로 수행하는 경우 문제는 재사용 가능성입니다(신경쓰지 않을 수 있음).
두 개의 다른 버튼으로 myFun을 두 번 실행하는 경우(창을 샌드박싱하고 두 개의 인스턴스를 실행할 수 있기를 원한다고 가정해 보겠습니다).충돌이 발생하고 두 번째 호출이 첫 번째 호출을 무시합니다.
아래를 참조하십시오.
names default to here(1);
new namespace("test");
test:myFun = Function({A1, Z1},{Default Local},
test:A = A1;
test:Z = Z1;
test:A[2] = 10;
test:B = 2*test:A;
show(test:A);
show(test:B);
show(test:Z);
//::g_b = b;
//::g_z = z;
test:nw = new window("test",
vlistbox(
textbox(test:Z),
textbox(char(test:B)),
buttonbox("Show array B (works)",
show(test:B)
),
buttonbox("Show string Z (works)",
show(test:Z)
),
buttonbox("show and close (works)",
show(test:Z, test:B); test:nw << closewindow())
)
)
);
x = [2,3];
y ="string";
test:myFun(x,y);
test:myFun([12, 14], "something else");
네임스페이스를 사용하는 경우 창 네임스페이스를 사용하는 것이 좋습니다. 창이 사라지면 자동으로 삭제되며 동일한 두 창 사이에 충돌이 발생하지 않습니다.
names default to here(1);
myFun = Function({A1, Z1},{DEFAULT LOCAL},
A = A1;
Z = Z1;
A[2] = 10;
B = 2*A;
show(A);
show(B);
show(Z);
//::g_b = b;
//::g_z = z;
nw = new window("test",
window:B = B; //uses the builtin window namespace
window:Z = Z; //works because this is a glue statement that returns the last thing
window:box = vlistbox( //which in this case is the vlistbox
textbox(window:Z),
textbox(char(window:B)),
buttonbox("Show array B (works)",
show(window:B)
),
buttonbox("Show string Z (works)",
show(window:Z)
),
buttonbox("show and close (works)",
show(window:Z, window:B); window:box << closewindow())
)
);
);
x = [2,3];
y ="string";
myFun(x,y);
myFun([12, 14], "something else");Re: JSL 함수의 변수 동작고마워 빈스. 나는 eval(substitute(expr()))을 생각하지 않았습니다. 좀 더 복잡한 일부 스크립트의 경우 대체되는 항목과 위치를 추적하는 것이 너무 어려울 수 있다고 생각합니다. 내 코드는 정확히 잘 구성되어 있지 않으며 디버그가 어려울 것입니다.Re: JSL 함수의 변수 동작감사합니다. 귀하의 글로벌 아이디어가 저에게 또 다른 아이디어를 주었습니다.변수가 전역적이라는 사실은 크게 신경 쓰지 않지만 전역적이어야 하는 경우 포함된 네임스페이스로 범위를 지정하는 것이 좋습니다.
나는 clear globals() 명령이 여기에서 나를 물어뜯을 것이라고 생각하지 않지만 내 리콜 기능으로 나를 얻었습니다(내 글로벌 리콜 변수는 clear globals()를 사용하는 다른 스크립트에 의해 지워졌습니다).저는 JMP에 이메일을 보냈고 그들은 두 가지 대안을 제안했습니다. 전역 변수를 잠그거나 자체 네임스페이스에 넣어 보호하는 것입니다. 네임스페이스는 견고성 측면에서 실제로 더 간단했습니다.
어쨌든 아래의 업데이트된 코드는 제대로 작동하는 것 같습니다. 단점은 변수를 참조할 때마다 "test:"를 추가로 입력한다는 것입니다. 스크립트의 모든 변수 사용에 필요하지 않을 수도 있지만 다른 한편으로는 아마도 좋은 습관일 것입니다. 이 특정 사용은 전역 네임스페이스이기 때문에 커서를 변수 이름 위로 가져가면 변수 내용을 볼 수 있습니다.
A1 및 Z1의 사용에 유의하십시오. test:A 및 test:Z에 할당할 수 없었습니다.
오류: 인수는 'Function' , Function/*###*/({test:A, test:Z}, .....의 액세스 또는 평가 목록에 있어야 합니다.
여러 파일에서 이 작업을 수행할 수 있는지 확인하겠습니다.
new namespace("test");
test:myFun = Function({A1, Z1},{Default Local},
test:A = A1;
test:Z = Z1;
test:A[2] = 10;
test:B = 2*test:A;
show(test:A);
show(test:B);
show(test:Z);
//::g_b = b;
//::g_z = z;
test:nw = new window("test",
vlistbox(
textbox(test:Z),
textbox(char(test:B)),
buttonbox("Show array B (works)",
show(test:B)
),
buttonbox("Show string Z (works)",
show(test:Z)
),
buttonbox("show and close (works)",
show(test:Z, test:B); test:nw << closewindow())
)
)
);
test:x = [2,3];
test:y ="string";
test:myFun(x,y);Re: JSL 함수의 변수 동작이 작업을 수행하려면 전역 변수를 설정해야 했습니다.대화 상자 코드가 변수를 제대로 볼 수 없는 것 같습니다.이것은 함수 내부에 지역 변수를 갖는 목적을 무산시키기 때문에 훌륭한 해결책이 아닙니다.
names default to here(1);
myFun = Function({A, Z},{Default Local},
A[2] = 10;
B = 2*A;
show(A);
show(B);
show(Z);
::g_b = b;
::g_z = z;
::g_nw = new window("test",
vlistbox(
textbox(Z),
textbox(char(B)),
buttonbox("Show array B (works)",
show(::g_B)
),
buttonbox("Show string Z (does not work)",
show(::g_Z)
),
buttonbox("show and close (does not work)",
show(::g_Z, ::g_B); ::g_nw << closewindow())
)
)
);
x = [2,3];
y ="string";
myFun(x,y);Re: JSL 함수의 변수 동작B는 나를 위해 일하지도 않았습니다.
이것은 일반적으로 GUI 작업을 수행하는 방법입니다.당신이 준 예에는 지나치게 복잡하지만 몇 가지 다른 방법을 보여주는 것 같습니다.
names default to here(1);
myFun = Function({A, Z},{Default Local},
A[2] = 10;
B = 2*A;
Eval(
Substitute(
Expr(
nw = new window("test",
vlistbox(
textbox(char(DV_Z)),
textbox(char(DV_B)),
buttonbox("Show array B (works)",
show([]||DV_B); //otherwise you run into an invalid matrix token
),
buttonbox("Show string Z (does not work)",
//show([]||DV_Z); //shouldn't work, you can't make a string a matrix
show(DV_Z);
//or
show(list(DV_Z));
),
buttonbox("show and close (does not work)",
<<SET function=""></SET>JSL 함수의 변수 동작
내 스크립트에는 일반적으로 두 가지 주요 구성 요소가 있습니다. 기본 기능과 GUI 코드가 모두 동일한 파일에 있습니다. 저는 일반적으로 Here 네임스페이스에 포함된 변수를 사용하고, 사용자 입력에서 변수를 가져오고, '확인' 버튼 상자에서 기본 함수를 호출합니다. 저는 메인 함수에 변수를 전달하지 않고 'OK' 버튼 상자 스크립트에 할당된 변수를 사용합니다. GUI가 포함된 파일 하나와 기본 기능이 포함된 두 번째 파일이 있도록 적어도 하나의 스크립트를 변경하는 것을 고려하고 있습니다. 그 전에 하나의 JSL 파일 내에서 어떻게 작동하는지 확인하고 있습니다. 다음은 GUI를 우회하고 함수가 정의된 후 호출되기 전에 변수를 정의하는 제거된 예입니다.
내가 알아차린 한 가지는 스크립트 실행 후 디버그하기가 더 어렵다는 것입니다. 왜냐하면 x와 y 위로 마우스를 가져가면 창 하단의 상태 표시줄에서 내용을 볼 수 있기 때문입니다. 그러나 이것은 지역 변수 A, B, Z 및 nw에 대해서는 그렇지 않습니다. 누군가 이것에 대한 팁이 있는지 궁금합니다.
버튼 상자 스크립트에서 변수 내용에 액세스하는 방법도 잘 모르겠습니다. 아래 코드를 실행하면 A, B, Z가 예상대로 로그에 표시되고(새 창이 생성되기 직전부터) B와 Z도 새 창 텍스트 상자에 표시되지만 버튼 box 스크립트는 이러한 변수에 직접 액세스할 수 없습니다. 배열 B를 얻기 위해 eval(parse(eval insert()))를 사용할 수 있었지만 문자열 Z를 얻을 수 없었습니다.이것을 작동시키는 더 직접적인 방법이 있습니까?
names default to here(1);
myFun = Function({A, Z},{Default Local},
A[2] = 10;
B = 2*A;
show (A);
show(B);
show(Z);
nw = new window("test",
vlistbox(
textbox(Z),
textbox(char(B)),
buttonbox("Show array B (works)",
show(parse(Eval(Parse(Eval Insert(
"\[^"char(B)"^]\"
)))))
),
buttonbox("Show string Z (does not work)",
show(Eval(Parse(Eval Insert(
"\[^"char(Z)"^]\"
))))
),
buttonbox("show and close (does not work)", show(Z, B); nw << closewindow())
)
)
);
x = [2,3];
y="string";
myFun(x,y);
감사해요,
마이크
자동화 및 스크립팅품질 및 프로세스 엔지니어링