2014-12-07 3 views
1
(let ((a 3)) 
    (let ((a 4) 
     (b a)) 
    (+ a b))) 

위의 코드는 b가 바깥 쪽 값인 a을 취하는 것으로 7을 평가합니다. 나의 이해에 따르면, 어휘 바인딩에서 'let'의 각 사용은 새로운 위치를 만든다. 그렇다면 변수 은 (b a)a(a 4)의 값을 사용하지 않는 이유는 무엇입니까?Lisp에서의 어휘 적 바인딩

답변

5

여기가 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*을 참조하십시오.

+0

그리고 이름의 어휘 환경이란 정확히 무엇을 의미합니까? 그것의 범위를 말하는가? – Hubble

+0

@hubble 기본적으로 그렇습니다. 어휘 환경은 모든 실제적인 목적을 위해 어휘 범위와 같습니다. 동적 환경은 실행시 정확한 호출 경로에 따라 다릅니다. – Vatine

0
(let ((a 4) 
     (b a)) 
    (+ a b)) ; ==> 7 

작성하는 것과 같습니다

((lambda (a b) 
    (+ a b)) 
4 
a) ; ==> 7 

당신이 ab4a의 평가 후 바인딩 논리적이 버전에서 볼 수 있습니까?

지금 우리가 가지고 동등

(let* ((a 4) 
     (b a)) 
    (+ a b)) ; ==> 8 

: 여기

(let ((a 4)) 
    (let ((b a)) 
    (+ a b))) ; ==> 8 

let은 제의 본체이다. ab에 대한 표현을 평가할 때 4입니다.