defvar
setq
또는 say와 같은 방식으로 변수 값을 다시 할당하지 않습니다
setf
. 변수에 값이 있으면 defvar
만지지 않습니다.
에서 defvar
의 문서화 문자열 :
(defvar SYMBOL &optional INITVALUE DOCSTRING)
SYMBOL을 변수로 정의하고 SYMBOL을 리턴하십시오.
...
선택적 인수 INITVALUE가 평가되고 SYMBOL의 값이 void 인 경우에만 SYMBOL을 설정하는 데 사용됩니다 . SYMBOL이 버퍼 로컬 인 경우 기본값은 설정된 값입니다. 버퍼 로컬 값은 영향을받지 않습니다. INITVALUE가 없으면 SYMBOL의 값이 설정되지 않습니다.
...
defvar
라이브러리를 처음로드 할 때 해당 변수를 사용하여 값을 제공하는 것으로 추정되므로 라이브러리를 다시로드해도 값이 변경되지 않습니다.
전역 변수 정의 의 elisp 수동 노드도 참조하십시오
.
에 의존하는 대신 defvar
항상을 사용하여 값을 다시 할당 할 수 있습니다 setq
. 대안으로, 엉뚱한 옵션으로, 당신은 unintern
심볼 defvar
을 다시로드 할 때 심볼을 찾을 수 없도록 할 수 있습니다 :
(defvar test-1 "test this")
(defvar test-2 "test this one, too")
test-1 ; => "test this"
test-2 ; => "test this one, too"
(defvar test-1 "trying to redefine")
(defvar test-2 "trying to redefine, too")
test-1 ; => "test this"
test-2 ; => "test this one, too"
(mapc #'unintern '(test-1 test-2))
test-1 ; => error!
test-2 ; => error!
(defvar test-1 "trying to redefine")
(defvar test-2 "trying to redefine, too")
test-1 ; => "trying to redefine"
test-2 ; => "trying to redefine, too"
(unload-feature 'myname)
먼저?