Hãy tưởng tượng rằng tôi có các tệp sau trong gói (lố bịch) của mình:
Tập tin test1.el
:
;;; test1.el ---
;;; Code:
(defvar test-var1)
(defun test-fun1 (test)
nil)
(require 'test2 "./test2.el)
(provide 'test1)
;;; test1.el ends here
Tập tin test2.el
:
;;; test2.el ---
;;; Code:
(defun test-fun2 ()
(let ((test test-var1))
(test-fun1 test)))
(provide 'test2)
;;; test2.el ends here
Nếu sau đó tôi chạy:
emacs -batch -f batch-byte-compile *.el
Tôi nhận được kết quả sau:
Compiling .../test1.el...
Wrote .../test1.elc
Compiling .../test2.el...
In test-fun2:
test2.el:9:15:Warning: reference to free variable `test-var1'
In end of data:
test2.el:14:1:Warning: the function `test-fun1' is not known to be defined.
Wrote .../test2.elc
Tôi hiểu tại sao những cảnh báo này xuất hiện và tôi hiểu rằng chúng chỉ là những cảnh báo. Tuy nhiên, thật dễ dàng để bỏ lỡ một lỗi đánh máy trong tên hàm bằng cách loại bỏ tất cả các cảnh báo thuộc loại này.
Tôi bằng cách nào đó nghĩ rằng thêm một (require 'test2)
dòng trong test2.el
nên sửa nó. Tuy nhiên, trong trường hợp này tôi nhận được:
Compiling .../test1.el...
In toplevel form:
test1.el:10:1:Error: Recursive `require' for feature `test2'
Compiling .../test2.el...
In toplevel form:
test2.el:5:1:Error: Recursive `require' for feature `test1'
Điều này là khó hiểu, bởi vì tôi nghĩ rằng điểm require
chính xác là để tránh tải đệ quy. Tôi cho rằng đó require
là hành xử như load
trong thời gian biên dịch.
Một cách tốt (và an toàn) để thoát khỏi những cảnh báo này là gì?
Hướng dẫn đưa ra cách giải quyết (tôi đăng nó dưới dạng câu trả lời tốt hơn không có gì bên dưới), nhưng cuối cùng, tôi muốn giải pháp khá tự động (không yêu cầu tôi liệt kê tất cả các hàm và biến mà tôi sẽ cần mỗi tập tin).
Giải pháp lý tưởng sẽ được tích hợp sẵn trong emacs hoặc được cung cấp với Cask. Nếu nó không tồn tại, tôi sẽ lấy những gì có sẵn trong khóa học.
-mode
chức năng). Ví dụ này là một ví dụ về đồ chơi, việc sử dụng nótest-fun2
sẽ không thay đổi vấn đề gì cả.