그래픽 스크립트를 추가할 때 그래프 상자 프레임 참조가 '손실'됩니다.다음 코드에서 잘 작동하는 간단한 웨이퍼맵을 그리려고 합니다.
그러나 숫자를 변수로 대체하면 누락된 참조 오류가 발생하고 평생 동안 이런 일이 일어나는 이유를 이해할 수 없습니다. JSL 전문가의 지혜가 필요합니다 
F_makeWaferMap = function({myScale, myWhiteSpace, myWaferDiameter},{},
myKeepOutZone = 2000;
myGraphBox = graphBox(
frameSize( (myWaferDiameter/2)/myScale, (myWaferDiameter/2)/myScale ),
xScale( -myWhiteSpace, myWaferDiameter + myWhiteSpace),
yScale( -myWhiteSpace, myWaferDiameter + myWhiteSpace)
);
frame = myGraphBox[FrameBox(1)];
frame << Add Graphics Script(penColor( "red" ); circle( {150000,150000}, 150000));
frame << Add Graphics Script(penColor( "red" ); circle( {150000,150000}, 150000-2000));
return(myGraphBox);
);
myWmDispObj = F_makeWaferMap(200, 20000, 300000); // Scale, Whitespace, Wafer Diameter
newWindow("Test", vListBox(myWmDispObj));
나는 당신이 로그에서 볼 수 있듯이 행복하게 프레임 상자에 대한 참조를 만들고 있습니다.</CODE></P><P><SPAN class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="thickey_1-1647940813033.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="thickey_1-1647940813033.png" style="width: 347px;"><span class="lia-inline-image-display-wrapper" image-alt="thickey_1-1647940813033.png" style="width: 347px;"><img src="https://us.v-cdn.net/6038925/uploads/images/41020iDC2927C13A39326F/thickey_1-1647940813033.png" role="button" title="thickey_1-1647940813033.png" alt="thickey_1-1647940813033.png" /></span></SPAN></SPAN></P><P><CODE class=" language-jsl">
이제 일부 변수를 대체해 보겠습니다.
frame << Add Graphics Script(penColor( "red" ); circle( {myWaferDiameter/2, myWaferDiameter/2}, myWaferDiameter/2));
frame << Add Graphics Script(penColor( "red" ); circle( {myWaferDiameter/2, myWaferDiameter/2}, (myWaferDiameter/2) - myKeepOutZone));그리고 프레임 상자에 변수를 추가하려고 할 때 전달된 변수에 대한 참조가 손실되었음을 나타내는 다음 오류가 발생합니다.

나는 당황 
스크립팅Re: 그래픽 스크립트를 추가할 때 그래프 상자 프레임 참조가 '손실'됩니다.안녕하십니까 @Joseph_Reese ,
이것은 함수 내부에 정의된 변수가 기본적으로 해당 함수에 국한되지 않기 때문에 작동합니다. 스크립트를 실행하기 전에 delete symbol()을 사용하고 해당 스크립트를 실행한 후에 show symbol()을 사용하면 myWaferDiameter1이 이제 전역 변수임을 알 수 있습니다. 함수를 작성할 때마다 이러한 이유로 {defaultlocal}을 두 번째 인수로 사용하거나 해당 매개변수의 함수에서 생성된 모든 변수의 이름을 지정하여 모두 해당 함수 호출에만 국한되도록 권장합니다.기본 로컬을 사용하면 그래프를 그릴 때 변수가 더 이상 존재하지 않기 때문에 오류가 다시 나타납니다.처럼 @jthi 함수 컨텍스트에서 변수를 평가한 다음 그래프에 값을 전달하여 이 문제를 해결할 수 있습니다. 처럼 @Craige_Hales 제안된 대로 함수 실행이 완료되면 함수에 대한 매개변수도 제거되어 원래 문제가 발생했습니다.
그래서, 원래의 질문에 @두꺼운 :
원래 예제에서 그리고 함수의 로컬 변수를 사용하거나 함수에 대한 인수로 사용하는 경우 myWaferDiameter 값은 함수 실행이 완료될 때까지 메모리에서 제거될 때까지 함수의 로컬 네임스페이스에 존재합니다.그래프는 함수 실행이 끝날 때까지 그려지지 않기 때문에 변수 값에 접근할 수 없습니다. 이 문제를 해결하려면 함수 컨텍스트에서 변수를 평가하십시오.나는 또한 이것을하는 방법을 선호합니다 @jthi 설명:
Eval(EvalExpr(
frame << Add Graphics Script(
Pen Color("red");
Circle({Expr(myWaferDiameter) / 2, Expr(myWaferDiameter) / 2}, Expr(myWaferDiameter) / 2);
);
));
전역 변수인 함수에 변수가 정의된 경우 해당 변수는 삭제될 때까지(예: delete symbol() 사용) 또는 JMP가 다시 시작될 때까지 존재합니다. 따라서 함수가 완료된 후 창이 그려지면 여전히 변수에 액세스할 수 있습니다. 이것 ~이다 다른 창이나 스크립트가 예기치 않게 서로 상호 작용할 수 있으므로 향후 코드에서 오류가 발생할 가능성이 더 큽니다.
추신: 내 자신의 위시리스트 항목에 대한 뻔뻔한 플러그로서, 올바른 컨텍스트에서 myWaferDiamer를 평가하는 것이 새로운 기능을 도입하여 약간 더 직관적으로 만들 수 있다고 생각합니다. Eval( Eval Expr( ... ) )의 새 래퍼로 Eval Expr First()를 도입합니다.
Re: 그래픽 스크립트를 추가할 때 그래프 상자 프레임 참조가 '손실'됩니다.Joseph, 나도 이것을 알아차렸지만 당신처럼 로컬에서(함수에 대해) 생성된 변수가 작동하는 반면 전달된 변수는 작동하지 않는 이유를 이해하지 못합니다. V.흥미롭다.
Re: 그래픽 스크립트를 추가할 때 그래프 상자 프레임 참조가 '손실'됩니다.안녕하세요, 왜 이것이 작동하는지 정확히 모르지만 어떤 통찰력이라도 감사하겠습니다. 함수에 다른 변수를 설정하면(이 경우에는 myWaferDiameter1만) 프레임 메시지에 잘 전달되는 것 같습니까?
Names Default to Here( 1 );
F_makeWaferMap = function({myScale, myWhiteSpace, myWaferDiameter},{},
myWaferDiameter1 = myWaferDiameter; //new variable here?
myKeepOutZone = 2000;
<BR /> //Use myWaferDiameter1 instead
myGraphBox = graphBox(
frameSize( (myWaferDiameter1/2)/myScale, (myWaferDiameter1/2)/myScale ),
xScale( -myWhiteSpace, myWaferDiameter1 + myWhiteSpace),
yScale( -myWhiteSpace, myWaferDiameter1 + myWhiteSpace)
);
frame = myGraphBox[FrameBox(1)];<BR />
frame << Add Graphics Script(penColor( "red" ); circle( {myWaferDiameter1/2, myWaferDiameter1/2}, myWaferDiameter1/2));
frame << Add Graphics Script(penColor( "red" ); circle( {myWaferDiameter1/2, myWaferDiameter1/2}, (myWaferDiameter1/2) - myKeepOutZone));
return(myGraphBox);
);
myWmDispObj = F_makeWaferMap( 200, 20000, 300000 ); // Scale, Whitespace, Wafer Diameter
newWindow("Test", vListBox( myWmDispObj ));Re: 그래픽 스크립트를 추가할 때 그래프 상자 프레임 참조가 '손실'됩니다.매개변수 웨이퍼 직경 기능에서 메이크웨이퍼맵 함수가 실행되는 동안에만 존재합니다. <
나는 또한 일시적인 변수를 스톤으로 캐스팅하는 eval(evalexpr( ... expr() ... expr() ... ) ) 메서드를 좋아합니다. 대부분 JSL 편집기가 ( 및 ).
Re: 그래픽 스크립트를 추가할 때 그래프 상자 프레임 참조가 '손실'됩니다.Eval(EvalExpr()) 또는 대체를 사용하여 피할 수 있는 경우(이 경우 피할 수 있는 경우) Evil(Parse())을 사용하지 않습니다. 적어도 나는 이것들 이외의 다른 방법을 알지 못합니다. (또는 더 복잡하다면) 일부 플랫폼/jmp 함수의 값을 수식과 같은 값으로 대체하는 방법을 모릅니다. 내가 선호하는 방법은 EvalExpr()입니다. 디버그하기가 상당히 쉽고 여전히 스크립트 편집기에서 JSL 강조 표시를 제공하기 때문입니다(파싱 방법은 사용하지 않음).
Names Default To Here(1);
F_makeWaferMap = function({myScale, myWhiteSpace, myWaferDiameter},{},
myKeepOutZone = 2000;
myGraphBox = graphBox(
frameSize( (myWaferDiameter/2)/myScale, (myWaferDiameter/2)/myScale ),
xScale( -myWhiteSpace, myWaferDiameter + myWhiteSpace),
yScale( -myWhiteSpace, myWaferDiameter + myWhiteSpace)
);
frame = myGraphBox[FrameBox(1)];
expr_sub = Substitute(
Expr(frame << Add Graphics Script(
penColor("red");
circle({myWaferDiameter/2, myWaferDiameter/2}, myWaferDiameter/2)
)),
Expr(myWaferDiameter),
myWaferDiameter
);
expr_evalexpr = EvalExpr(
frame << Add Graphics Script(
penColor( "red" );
circle({Expr(myWaferDiameter)/2, Expr(myWaferDiameter)/2}, (Expr(myWaferDiameter)/2) - Expr(myKeepOutZone)));
);
show(expr_sub);
show(expr_evalexpr);
Eval(expr_sub);
Eval(expr_evalexpr);
return(myGraphBox);
);
myWmDispObj = F_makeWaferMap(200, 20000, 300000); // Scale, Whitespace, Wafer Diameter
newWindow("Test", vListBox(myWmDispObj));
Show(myWmDispObj << Get Graphics Script);Re: 그래픽 스크립트를 추가할 때 그래프 상자 프레임 참조가 '손실'됩니다.안녕하세요 Jarmo, 예, JSL로 변환할 문자열에 내 변수를 대체하여 간단히 eval(parse())을 수행할 수 있지만 제 생각에는 '적절한' 방법이 아닙니다. 확실히, 보다 ;직접적인' 방식으로 이에 대한 메커니즘이 있습니다.
eval(parse("frame << Add Graphics Script(penColor( \!"red\!" ); circle( {150000,150000}, " || char(myWaferDiameter/2) || "))"));Re: 그래픽 스크립트를 추가할 때 그래프 상자 프레임 참조가 '손실'됩니다.Eval(EvalExpr()) 마법을 사용해야 할 수도 있습니다. Eval Insert, Eval Expr, Parse 및 Substitute를 사용하여 한 표현식을 다른 표현식에 삽입
Eval(EvalExpr(
frame << Add Graphics Script(
Pen Color("red");
Circle({Expr(myWaferDiameter) / 2, Expr(myWaferDiameter) / 2}, Expr(myWaferDiameter) / 2);
);
));