Xử lý cảnh báo của VÒNG: gán cho biến miễn phí, khi các thư viện nhất định có thể bị thiếu


12

Biên dịch byte của chế độ của tôi:

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

đưa ra cảnh báo:

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

Đây là tình huống bình thường vì er/try-expand-listđược định nghĩa trong externa; thư viện expand-regiontại http://elpa.gnu.org

Chế độ của tôi đăng ký mở rộng vào expand-regionthư viện nhưng vẫn ổn khi chạy chế độ của tôi mà không có expand-regionchế độ.

Tôi nghĩ rằng cách thích hợp để đối phó với cảnh báo là thêm khai báo:

(defvar er/try-expand-list)

defvar tài liệu nói:

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

Tôi sử dụng -*- lexical-binding: t -*-. Điều đó có nghĩa là không có defvarbiến er/try-expand-listtrong phạm vi từ vựng và tôi có lỗi thực sự?


2
Lưu ý bên: bạn không nên trích dẫn biểu tượng trong (defvar er/try-expand-list).
JeanPierre

@JeanPierre Đã sửa.
gavenkoa

Câu trả lời:


10

Không, setsetqkhông khai báo các biến từ vựng. Chỉ letcó. Nếu bạn đã sử dụng letở đây, bạn sẽ có một lỗi, nhưng điều này là tốt. Cảnh báo tồn tại chủ yếu để bắt lỗi chính tả khi sử dụng các biến động.

Để làm cho cảnh báo biến mất sử dụng defvarnhư trong câu hỏi của bạn, nhưng không trích dẫn biểu tượng.


Là gói vào eval-when-compiledư thừa để chỉ defvar? Tôi thấy không có cảnh báo mà không có eval-when-compile. Có vẻ eval-when-compilecần thiết nếu sử dụng mã hoạt động, như (require ...)...
gavenkoa

3
Gói defvar sẽ là dư thừa.
lunaryorn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.