Thành ngữ phổ biến để giải quyết mở rộng macro hoặc giải quyết cảnh báo về các biến không xác định trong quá trình biên dịch byte:
(eval-when-compile
(require 'cl-lib))
Nhưng điều này require ...được biên soạn thành .elctập tin! Tôi thấy rằng cl-eval-whencó ngữ nghĩa thích hợp (theo tên).
Thông thường chúng tôi không cần requirelàm tệp trang web vàpackage.el
Ví dụ: tôi muốn biên dịch byte của tôi .emacs, sử dụng một số macro bên ngoài, nhưng âm thầm chuyển qua nếu không có gói như vậy:
(cl-eval-when 'compile
(condition-case err
(require 'w3m-util)
(error (byte-compile-warn "Failed by: %S" err))))
(w3m-util-DEPENDENT-CODE ...)
Một cách khác để làm điều này là:
(ignore-error
(require 'w3m-util)
(w3m-util-DEPENDENT-CODE ...))
Nhưng bây giờ chúng tôi không phải là một hình thức cấp cao nhất ...
Tôi có điền đúng eval-when-compiletên đó để làm điều gì đó không được mong đợi từ tên của nó không?
(when (require 'w3m-util nil t) (w3m-util-DEPENDENT-CODE...))
(when (require 'w3m-util nil t) ...)là thành ngữ tốt đẹp! Nhưng tôi cố gắng tạo ra một .emacstập tin hoàn hảo , không phải là một thư viện. Vì vậy, hãy nhớ tải mã chậm (theo yêu cầu) với sự trợ giúp của tự động tải. Vì lý do này, tôi sử dụng rộng rãi eval-after-load, chỉ yêu requirecầu để tạo thành công biên dịch byte với mở rộng macro.
w3m-DEPENDENT-CODEkhỏi mất tíchw3m-util.