2010-04-18 2 views
5

공통 리스프의 바인딩 (LET)과 심볼 (= 변수) 설정의 차이점은 무엇입니까?common-lisp : 바인딩과 심볼의 차이

+0

"... 및 기호 (= 변수)"란 무엇을 의미합니까? 당신이 묘사하고있는 두 개념에 대한 표현의 예를 들려 줄 수 있습니까? –

답변

6

기호와 변수는 매우 다른 두 종류의 엔티티입니다. 상징은 무언가의 이름이다; 변수는 값의 컨테이너입니다. 변수의 이름은 기호로 지정할 수 있습니다.

바인딩은 심볼과 변수 사이의 연관입니다. 바인딩이 유효 할 때 변수의 이름을 참조 할 수 있습니다. let 양식은 그러한 바인딩을 만듭니다.

+0

죄송 합니다만 내가 충분히 명확하지 않은 경우. 나는이 자습서를 찾고 있었어요 : http://en.wikibooks.org/wiki/Common_Lisp/First_steps/Beginner_tutorial의 차이는 무엇 : 1 setf의 (하자 ((1))) 및 을 () – martins

+1

(let ((a 1)) ...)은 기호 A와이 변수 사이의 바인딩 ("let"내부의 어휘 적 컨텍스트에서)을 생성하고 (1을 초기화합니다) 변수를 만듭니다 (로컬 어휘 범위 사용). (setf a 1)은 다르게 동작 할 수 있습니다. 바인딩 A가 있으면 값이 변경됩니다. 바인딩이 없으면 전역 바인딩 A를 생성하고이를 1로 초기화합니다. 그러나 전역 바인딩의 종류는 지정되지 않고 Lisp 구현 (및 해당 버전)마다 다릅니다. 따라서 A라는 변수가 있으면 setf가 값을 변경합니다. 그렇지 않으면 결과가 완전히 지정되지 않습니다. –

1

(let ((a 1)))은 let 앞에 도달 괄호와 일치하는 닫는 대괄호가 도달 할 때까지 a의 값을 1로 설정합니다.이 시점에서 a는 이전 값이 또는 정의되지 않음). 함수의 끝 부분에서 벗어날 필요가있는 지역 변수를 필요로하는 함수의 본문을 자주 보게됩니다. 그래서 let을 사용하게 될 것입니다.

(setf a 1)은 a를 1로 설정하고 a가 이미 정의되어 있는지 (defparameter, defvariable 또는 let에 관계없이) 또는 a가 값이 필요한 새 특수 변수임을 전제로합니다.

좀 더 복잡하지만 그 설명을하기 위해 혀짤 소리가 나올지 확신하지 못합니다.