설계 상 특정 라이브러리가 누락 될 수있는 경우 "경고 : 자유 변수에 할당"처리


12

내 모드의 바이트 컴파일 :

(defun dict-setup-expansions ()
  "Add `dict-mode' specific expansions."
  (set (make-local-variable 'er/try-expand-list) (list #'dict-mark-article)))

경고합니다 :

Warning: assignment to free variable `er/try-expand-list'

er/try-expand-listexterna에 정의되어 있기 때문에 이것은 정상적인 상황 입니다. http://elpa.gnu.org에expand-region 있는 도서관

expand-region라이브러리에 내 모드 등록 확장 프로그램 이지만 모드없이 expand-region모드 를 실행해도 됩니다.

경고를 처리하는 올바른 방법은 선언을 추가하는 것입니다.

(defvar er/try-expand-list)

defvar 문서 말 :

The `defvar' form also declares the variable as "special",
so that it is always dynamically bound even if `lexical-binding' is t.

사용 -*- lexical-binding: t -*-합니다. defvar변수 없이 er/try-expand-list어휘 범위에 있고 실제 버그가 있음 을 의미합니까 ?


2
참고 :에서 기호를 인용해서는 안됩니다 (defvar er/try-expand-list).
JeanPierre

@JeanPierre 수정되었습니다.
gavenkoa

답변:


10

아니, set그리고 setq어휘 변수를 선언하지 않습니다. 그렇습니다 let. 당신이 사용했다 let당신이 버그를 가지고 싶지만,이 괜찮 여기. 동적 변수를 사용할 때 오타가 발생하는 경우가 대부분 있습니다.

defvar질문에서와 같이 경고를 사용 하지 않으 려면 기호를 인용 하지 마십시오 .


eval-when-compile중복으로 포장되어 defvar있습니까? 없이는 경고가 표시되지 않습니다 eval-when-compile. 다음 eval-when-compile과 같이 활성 코드를 사용하는 경우 필요한 것 같습니다 (require ...).
gavenkoa

3
데프 바 포장은 중복됩니다.
lunaryorn
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.