(let ((a 3))
(let ((a 4)
(b a))
(+ a b)))
위의 코드는 b가 바깥 쪽 값인 a
을 취하는 것으로 7을 평가합니다. 나의 이해에 따르면, 어휘 바인딩에서 'let'의 각 사용은 새로운 위치를 만든다. 그렇다면 변수 은 (b a)
a
(a 4)
의 값을 사용하지 않는 이유는 무엇입니까?Lisp에서의 어휘 적 바인딩
(let ((a 3))
(let ((a 4)
(b a))
(+ a b)))
위의 코드는 b가 바깥 쪽 값인 a
을 취하는 것으로 7을 평가합니다. 나의 이해에 따르면, 어휘 바인딩에서 'let'의 각 사용은 새로운 위치를 만든다. 그렇다면 변수 은 (b a)
a
(a 4)
의 값을 사용하지 않는 이유는 무엇입니까?Lisp에서의 어휘 적 바인딩
여기가 LET
입니다. 바인딩은 평행에서 이루어집니다. 바인딩은 순차적 방식으로 수행됩니다
CL-USER 60 > (let ((a 3))
(let ((a 4)
(b a))
(+ a b)))
7
버전은 LET*
라고합니다.
CL-USER 61 > (let ((a 3))
(let* ((a 4)
(b a))
(+ a b)))
8
Special Operator LET, LET*을 참조하십시오.
(let ((a 4)
(b a))
(+ a b)) ; ==> 7
작성하는 것과 같습니다
((lambda (a b)
(+ a b))
4
a) ; ==> 7
당신이 a
및 b
는 4
및 a
의 평가 후 바인딩 논리적이 버전에서 볼 수 있습니까?
(let* ((a 4)
(b a))
(+ a b)) ; ==> 8
: 여기
(let ((a 4))
(let ((b a))
(+ a b))) ; ==> 8
제 let
은 제의 본체이다. a
은 b
에 대한 표현을 평가할 때 4
입니다.
그리고 이름의 어휘 환경이란 정확히 무엇을 의미합니까? 그것의 범위를 말하는가? – Hubble
@hubble 기본적으로 그렇습니다. 어휘 환경은 모든 실제적인 목적을 위해 어휘 범위와 같습니다. 동적 환경은 실행시 정확한 호출 경로에 따라 다릅니다. – Vatine