マクロ展開を回避する、またはバイトコンパイル中に未定義の変数に関する警告を解決するための一般的なイディオム:
(eval-when-compile
(require 'cl-lib))
しかし、これrequire ...
は.elc
ファイルにコンパイルされました!cl-eval-when
(名前によると)適切なセマンティックスがあることがわかりました。
通常require
、サイトファイルやpackage.el
たとえば.emacs
、いくつかの外部マクロを使用して自分をバイトコンパイルしたいのですが、そのようなパッケージがない場合は黙ってパススルーします。
(cl-eval-when 'compile
(condition-case err
(require 'w3m-util)
(error (byte-compile-warn "Failed by: %S" err))))
(w3m-util-DEPENDENT-CODE ...)
これを行う別の方法は次のとおりです。
(ignore-error
(require 'w3m-util)
(w3m-util-DEPENDENT-CODE ...))
しかし、今はトップレベルのフォームではありません...
そのeval-when-compile
名前を適切に入力して、その名前から予期されないことをしますか?
(when (require 'w3m-util nil t) (w3m-util-DEPENDENT-CODE...))
(when (require 'w3m-util nil t) ...)
いいイディオムです!しかし、私.emacs
はライブラリーではなく、完璧なファイルを作ろうとしています。したがって、自動ロードの助けを借りて、遅延した(要求に応じて)コードのロードを念頭に置いてください。このため、私はを広く使用していますがeval-after-load
、require
マクロ展開でバイトコンパイルを成功させるには、尋ねる必要があります。
w3m-DEPENDENT-CODE
行方不明から保護しませんw3m-util
。