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 .elc
tập tin! Tôi thấy rằng cl-eval-when
có ngữ nghĩa thích hợp (theo tên).
Thông thường chúng tôi không cần require
là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-compile
tê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 .emacs
tậ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 require
cầu để tạo thành công biên dịch byte với mở rộng macro.
w3m-DEPENDENT-CODE
khỏi mất tíchw3m-util
.