JMP 범위 -- 동적 대 어휘 범위 및 일반 혼란 학습 JSL내가 틀렸다면 정정해 주십시오. 그러나 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()
/*** OUTPUT ***
7범위 지속성이 있는 어휘 범위 언어(Python과 같은)에서 기능적으로 동등한 작업을 수행하면 내부 함수의 둘러싸는 범위가 지속되고(외부 함수의 경우 로컬 범위임) 내부 함수의 이름 확인은 함수의 x-변수는 시스템의 어휘 읽기에서 값 4입니다.JMP는 lexical-scope를 사용하지 않고 dynamic-scope를 사용하기 때문에 스크립트 마지막에 내부 함수가 최종적으로 실행될 때 Local -> Here -> Global의 동적 이름 확인을 사용합니다. 현재 테이블의 이름) 값 7을 찾습니다.
이러한 유형의 동작을 이해하는 것은 JSL에서 강력한 프로그램을 구축하는 데 매우 중요하며 JSL을 배우거나 어려움을 겪는 모든 사람에게 지적하고 싶습니다.
어떤 생각/직관적이지 않은 예가 있으면 알려주세요!
자동화 및 스크립팅데이터 접근Re: JMP 범위 -- 동적 대 어휘 범위 및 일반 혼란 학습 JSL이것은 사실이며 언어를 배울 때 확실히 루프를 던졌습니다.다른 주름은 JSL이 용어 재작성 언어 표현식 개체 덕분에 범위 지정과 관련하여 LISP와 같지만 매크로를 처리하는 방법과 관련하여 LISP와 같지 않습니다.
널리 사용되는 것으로 알고 있는 유일한 다른 용어 재작성 언어는 Wolfram 언어입니다.나는 확실히 말할 수 있을 만큼 CS에 정통하지 않지만 용어 재작성 패러다임이 Lisp의 매크로보다 엄격하게 더 강력하다고 주장하는 사람들이 있다고 들었습니다.한편, Wolfram 언어는 Lisp가 s-expression이 충분하다고 판단한 m-expressions의 구현일 뿐이라는 주장도 들었습니다.
그럼에도 불구하고 JSL의 표현 시스템은 거의 모든 사람에게 생소할 것이며 표현 작업을 위한 기능의 인체공학적 특성은 그들에게 전혀 도움이 되지 않습니다.용어 다시 쓰기 기능 대신 문자열 조작 및 Parse()를 사용하는 사람들의 이 포럼에서 많은 예를 찾을 수 있는 이유가 있습니다.
Re: JMP 범위 -- 동적 대 어휘 범위 및 일반 혼란 학습 JSL저는 CS 담당자는 아니지만 학기 재작성에 관한 이 내용은 꽤 흥미롭습니다!참조해 주셔서 감사합니다. 이제 이 토끼 굴에서 밤을 새겠습니다...
제목: JMP 범위 관련 - 동적 범위와 어휘적 범위, 그리고 JSL 학습에서 흔히 발생하는 혼란그만큼
func = outer function;
func();
나를 당황하게 했다.
실행 후
func = outer function();
내부 함수의 정의는 func 변수에 저장됩니다.
이것이 바로 표시(함수) 가 반환하는 이유입니다.
func = Function({},Print(x));
이 시점에서 외부 기능 과 내부 기능 에 대한 모든 정보는 사라집니다.
따라서 func()는 Print(x)를 실행하고 ... 7을 출력합니다.
편집하다:
사실, 본문에 쓰인 내용과 비교했을 때 새로운 내용은 전혀 없습니다.
이것은 단지 JSL 프로그래머의 "2D 관점"일 뿐입니다.
제목: JMP 범위 관련 - 동적 범위와 어휘적 범위, 그리고 JSL 학습에서 흔히 발생하는 혼란JMP는 함수 정의 내의 변수를 현재 값 그대로 유지하며, 자동으로 현재 값으로 대체하지 않습니다.
그래서, 그 후에
x = 4;
inner function = Function( {}, Print( x ));
inner function is defined as
Function( {}, Print( x ));
내부 함수가 외부 함수 의 x 로 자신의 x를 대체하도록 하려면 다음과 같은 사전 평가가 필요합니다.
Names Default to Here( 1 );
x = 7;
outer function = Function( {},
{x},
x = 4;
Eval(Eval Expr( inner function = Function( {},
x= Expr(x);
Print( x )
)));
Return( Name Expr(inner function));
);
func = outer function;
func() // prints 4
수정: 다른 단어들과 동일한 2D 보기입니다.
제목: JMP 범위 관련 - 동적 범위와 어휘적 범위, 그리고 JSL 학습에서 흔히 발생하는 혼란나는 담장 너머로 재빨리 훑어보았다.
def outer():
y=4
def inner():
print(y)
return inner
f = outer()
y = 7
f() # -> 4
따라서 파이썬은 3을 반환합니다. 이는 inner가 정의될 때 어휘적 맥락에서 y가 이렇게 정의되기 때문입니다.
"정의됨" 또는 "반환됨"?
다시 한번 살펴보겠습니다.
def outer():
y=4
def inner():
print(y)
y=-100
return inner
f = outer()
y = 7
f()
-> -100