내가 틀렸다면 정정해 주십시오. 그러나 JMP에는 범위 지속성이 없는 동적 범위가 있는 것 같습니다(의사 네임스페이스 제외). 여기 , 현지의 , 창문 , 상자 ).이것은 참조 카운터를 사용하여 전체 범위 지속성을 가진 어휘 범위를 갖는 많은 인기 있는 프로그래밍 언어와 대조됩니다.
이로 인해 JMP의 이상한 범위 시스템으로 작업하는 데 필요한 직관을 얻을 때까지 많은 머리를 부딪쳤으며 많은 사람들에게 큰 혼란을 안겨주었습니다.동적 범위를 사용하는 프로그래밍 언어는 많지 않습니다(LISP는 중요한 예외이며 JSL은 LISP와 일부 유사함).
나는 JSL 문서 팀이 이 차이점을 지적하고 동적 범위를 더 잘 이해하는 방법에 대한 몇 가지 리소스/링크를 제공하도록 권장합니다. 이는 확실히 이름 확인을 수행하는 표준 방법이 아니기 때문입니다.
다음은 예입니다. 외부 함수의 로컬 범위는 return 문 직후에 정리되고 내부 함수 이름 확인은 동적입니다(현재 호출 스택 기반).
Names Default to Here( 1 );
x = 7;
outer function = Function( {},
{x},
x = 4;
inner function = Function( {},
Print( x )
);
Return( Name Expr( inner function ) );
);
func = outer function;
func()
//:*/
Names Default to Here( 1 );
x = 7;
outer function = Function( {},
{x},
x = 4;
inner function = Function( {},
Print( x )
);
Return( Expr( inner function ) );
);
func = outer function;
func()
/*:
7범위 지속성이 있는 어휘 범위 언어(Python과 같은)에서 기능적으로 동등한 작업을 수행하면 내부 함수의 둘러싸는 범위가 지속되고(외부 함수의 경우 로컬 범위임) 내부 함수의 이름 확인은 함수의 x-변수는 시스템의 어휘 읽기에서 값 4입니다.JMP는 lexical-scope를 사용하지 않고 dynamic-scope를 사용하기 때문에 스크립트 마지막에 내부 함수가 최종적으로 실행될 때 Local -> Here -> Global의 동적 이름 확인을 사용합니다. 현재 테이블의 이름) 값 7을 찾습니다.
이러한 유형의 동작을 이해하는 것은 JSL에서 강력한 프로그램을 구축하는 데 매우 중요하며 JSL을 배우거나 어려움을 겪는 모든 사람에게 지적하고 싶습니다.
어떤 생각/직관적이지 않은 예가 있으면 알려주세요!