setq와 defvar의 차이점은 무엇입니까


답변:


18

Emacs에게 다음 질문을 해야합니다 :. C-h iElisp 매뉴얼 ( m Elisp)을 선택 하고 색인에서 "defvar"( i defvar) 를 검색하십시오 . 그러면 변수 정의 노드로 이동합니다 .

Emacs는 doc 문자열을defvar 첨부 할 수 있으며 변수에 이미 값이 있으면 아무 것도 수행하지 않는다고 말합니다 .

또한 defvar할당 할 값이없는 사용에 대해 알려줍니다 (defvar foo).. 그것은 그 사실을 알려줍니다 동적 범위 할 수있는 변수를 선언합니다 .

setq 해당 속성이 없습니다.

defvarsetq이맥스 리스프와 커먼 리스프에, 비슷하지만, 상당히 다릅니다.

자세한 내용은 자세히 알아보십시오.


1
실제로 defvar는 주어진 값이 있으면 "동적 범위 지정"을 선언하며 변수에 이미 값이 있더라도 그대로 유지됩니다. OTOH "변수에 이미 값이 있다면 아무것도하지 않는다"는 defvar의 모든 유효한 사용에 대해 참입니다 (그리고 바이트 컴파일러는 나머지 경우에, 즉 첫 번째 사용 후 변수를 선언하는 경우) 경고를 발행해야합니다.
YoungFrog

따라서 defvar전역 변수 (명령형 프로그래밍 스타일에서와 같이) 및 사용자 정의 규칙 처럼 들리지만 setq는 함수형 프로그래밍 언어 (동적 / 어휘 범위 지정 규칙이있는 전역 범위 지정 모드에 따라 다름)의 바인딩과 비슷합니다. .......)
nicolas

@nicolas : 설명서를 읽으십시오. setqvar (발생)가 로컬인지 여부에 관계없이 var 값을 설정합니다. defvarvar를 전역으로 선언합니다. ( "buffer-local":이기도합니다 local-variable-p.) var 발생은 함수 arg로 또는에 의해 let일반적인 의미에서 "local"입니다. letetc 등에 의해 바인딩 된 var 가 전역 (또는 버퍼 로컬)이면 해당 기간 / 범위 동안 로컬 바인딩 (일반 의미)이 생성됩니다 let. 해당 바인딩 범위 내 setq에서 로컬 값을 변경합니다. var 발생 보다 로컬 (스택) 또는 전역 (힙) 인 var 발생 에 대해 이야기하는 것이 좋습니다 .
Drew

1
@nicolas : 시간을내어 읽고 다시 읽으십시오. 때로는 공식 사양처럼 정확하지만 파악하기 어려운 경우가 있습니다. 일단 당신이 그것을 얻으면, M-x report-emacs-bug다른 사람들이 더 쉽게 얻을 수 있도록 개선을 제안하는 것이 도움이 될 수 있습니다.
Drew

1
@nicolas : 의 변수 (전역 또는 버퍼 로컬 변수) 를 이해하는 것으로 시작하십시오 . 아마도 실제 지역 변수, 즉 스택의 변수를 이미 알고있을 것 입니다. 인터넷 검색도 도움이 될 수 있습니다.
Drew
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.